首页 文章 精选 留言 我的

精选列表

搜索[基础搭建],共10000篇文章
优秀的个人博客,低调大师

Python零基础学习笔记(二十二)—— set

''' set:类似dict,是一组key的集合,不存储value 本质:无序和无重复元素的集合 用途:经常用于去除list和tuple中的重复元素 ''' #创建 #创建set 需要一个list或者tuple或者dict作为输入集合 #重复元素在set中会自动被过滤 set1 = set([1, 2, 2, 2, 3, 4, 5]) print(set1) set2 = set((1, 2, 3, 1, 2, 3)) print(set2) set3 = set({1:"2" , 3: "4", 5: "2"}) print(set3) #添加 注意;列表不能作为key,而set里面存的就是key,所以不能添加list[] set1.add(5) print(set1) set2.add((1,2,1,5)) print(set2) #set3.add({1,2}) #会报错 #插入整个list tuple 字符串,打碎插入 set1.update([12,3]) print(set1) set1.update((22,23,24,24)) print(set1) set1.update("name") print(set1) #删除 set1.remove("n") print(set1) set1.remove(2) print(set1) #遍历 for i in set1: print(i) #注意:set没有索引 for index, data in enumerate(set1): print(index,data) s1 = set([1, 2, 3]) s2 = set([2, 3, 4]) #交集 a1 = s1 & s2 print(a1) print(type(a1)) #并集 a2 = s1 | s2 print(a2) print(type(a2)) #list -> set l1 = [1, 2, 3, 4] set3 = set(l1) #tuple -> set t1 = (1, 2, 3) s4 =set(t1) print(s4) #去重 list5 =[1, 1, 2, 3, 4, 3, 4] print(list5) list6 = list(set(list5)) print(list6)

优秀的个人博客,低调大师

Python零基础学习代码实践 —— 打印回文数

#打印回文数 num = int(input("请输入一个五位数:")) wanwei = num // 10000 qianwei = (num - wanwei * 10000) // 1000 baiwei = (num - wanwei * 10000 - qianwei *1000) // 100 shiwei = (num - wanwei * 10000 - qianwei *1000 - baiwei * 100) // 10 gewei = (num - wanwei * 10000 - qianwei *1000 - baiwei * 100 - shiwei * 10) if wanwei == gewei: if qianwei == shiwei: print("这是一个回文数") else: print("这个数不是回文数")

优秀的个人博客,低调大师

Python零基础学习笔记(九)—— 随机数

话不多说,直接上代码 import random #随机数 #1.从序列的元素中随机取出一个数 print(random.choice([1,3,5,7,9])) print(random.choice(["c","a", "b"])) print(random.choice(range(6))) print(random.choice("jjking")) #取字符串之中的一个字母 #生成1-100之间的随机数 r1 = random.choice(range(100))+1 print(r1) #random.randrange([start,] stop[, step]) #start——指定范围开始,包含在范围内,默认是0 #stop——指定范围结束,不包含在范围内 #step——指定的递增基数,默认是1 print(random.randrange(1, 100, 2)) print(random.randrange(1, 100, 3)) #随机生成[0,1)之间的数(浮点数) print(random.random()) list = [1,2,3,4,5] #将list中的所有元素随机排序 random.shuffle(list) print(list) #随机生成一个实数(可能是小数也可能是整数)uniform里面是范围 print(random.uniform(2,7)) 执行结果 C:\Users\Administrator\AppData\Local\Programs\Python\Python37-32\python.exe C:/Users/Administrator/PycharmProjects/untitled/day02/随机数.py 7 b 3 j 49 75 73 0.11410964627603948 [4, 3, 1, 2, 5] 2.1147715056040295 Process finished with exit code 0

优秀的个人博客,低调大师

Python零基础学习笔记(二)——数据的存储

计算机用来存储数据,计算数据 数据存放在内存里 bit中文名称是位,音译“比特”,是用以描述电脑数据量的最小单位。二进制数系统中,每个0或1就是一个位(bit)。 单位换算1Byte=8bit1Kb=1024bit=2^10bit=1/8KB1Mb=1024Kb=2^20bit=1/8MB1Gb=1024Mb=2^30bit=1/8GB1Tb=1024Gb=2^40bit=1/8TB 数据存储最基本的单位是字节,存储数据时高位补0,最高位表示符号位,负数为1,正数为0 源码/反码/补码之间的关系正整数的原码、反码和补码都一样;负数部分:原码和反码的相互转换:符号位不变,数值位按位取反原码和补码的相互转换:符号位不变,数值位按位取反,末位再加1已知补码,求原码的负数的补码:符号位和数值位都取反,末位再加1 绝对路径就是文件的真正存在的路径,是指从硬盘的根目录(盘符)开始,进行一级级目录指向文件。相对路径就是以当前文件为基准进行一级级目录指向被引用的资源文件。

优秀的个人博客,低调大师

Python零基础学习笔记(五)—— 标识符

简单的说就是一串字符串(但字符串未必是标识符) 规则: 只能由子母/数字/下划线组成 开头不能是数字 不能是关键字['False', 'None', 'True', 'and', 'as', 'assert', 'async', 'await', 'break', 'class', 'continue', 'def', 'del', 'elif', 'else', 'except', 'finally', 'for', 'from', 'global', 'if', 'import', 'in', 'is', 'lambda', 'nonlocal', 'not', 'or', 'pass', 'raise', 'return', 'try', 'while', 'with', 'yield'] import keywordprint(keyword.kwlist)以上两行为查看关键字的代码 区分大小写 见名知意 遵循驼峰原则(从第二个单词开始首字母大写 例如:makeFile) 作用;:给函数/变量命名的 注意: 在python3中,非ascii码也可以做标识符

优秀的个人博客,低调大师

Python零基础学习笔记(六)—— 变量和常量

变量: 程序可操作的存储空间的名称 程序运行期间可改变的数据 每个变量都有特定的类型 作用:将不同类型的数据存储到内存 定义变量:变量名 = 初始值(为了确定变量的类型,python里面可以直接识别数据类型 例如:age = 10) 数据的存储:变量名 = 数据值 特别注意:变量在使用前必须定义,否则会报错 删除变量:del 变量名(删除后变量名无法使用,再次调用会报错) 小技巧: 查看age变量类型 print(type(age)) 查看age变量地址 print(id(age)) 常量:程序运行期间不能改变的数据

优秀的个人博客,低调大师

拿空间换时间的字典-Python基础前传(9)

科学存在的逻辑只有两个: 1.解释问题 2.解决问题 我们明白了科学的逻辑,我们就能理解任何的知识和技能 (一)Python中为什么要有字典 之前jacky跟大家说list因为太过自由,为了安全性才引入了元组;本次分享的字典同样也是起源于list列表,为了弥补list查找元素慢的缺点,Python引入了字典dict; 1.1 字典概述 Python内置了字典:dict的支持,dict全称dictionary,在其他语言中也称为map,使用键-值(key-value)存储,具有极快的查找速度。 字典需要用大括号扩起来,对于字典来说,它的每一个元素都是一个键值对 一个键,一个值组成了一对; 键值对什么意思 user_info = { 'name' = 'jacky', 'age' = 33, 'gender' = 'male'} 1.2 为什么字典查找速度快 为什么dict查找速度这么快?因为dict的实现原理和查字典是一样的。假设字典包含了1万个汉字,我们要查某一个字,一个办法是把字典从第一页往后翻,直到找到我们想要的字为止,这种方法就是在list中查找元素的方法,list越大,查找越慢。 第二种方法是先在字典的索引表里(比如部首表)查这个字对应的页码,然后直接翻到该页,找到这个字。无论找哪个字,这种查找速度都非常快,不会随着字典大小的增加而变慢。 dict就是第二种实现方式,给定一个名字,比如’jacky’,dict在内部就可以直接计算出jacky对应的存放成绩的“页码”,也就是95这个数字存放的内存地址,直接取出来,所以速度非常快。 1.3 列表与字典的比较 dict是用空间来换取时间的一种方法 和list比较,dict有以下几个特点: 查找和插入的速度极快,不会随着key的增加而变慢;需要占用大量的内存,内存浪费多。 而list相反: 查找和插入的时间随着元素的增加而增加;占用空间小,浪费内存很少。 (二)在什么情景下用dict dict可以用在需要高速查找的很多地方,在Python代码中几乎无处不在,正确使用dict非常重要,需要牢记的第一条就是dict的key必须是不可变对象。 这是因为dict根据key来计算value的存储位置,如果每次计算相同的key得出的结果不同,那dict内部就完全混乱了。这个通过key计算位置的算法称为哈希算法(Hash)。 要保证hash的正确性,作为key的对象就不能变。在Python中,字符串、整数等都是不可变的,因此,可以放心地作为key。而list是可变的,就不能作为key (三)字典的功能 索引 字典里实际上相当于自建了索引,就不像列表、元组那样,用自己的key就可以了 user_info['name'] 没有切片功能 列表和元祖的key是连续的,是吧,0,1,2,3… …,而字典的key是自设的,是不连续的,所以就没有切片功能; 循环 默认值输出key for i in user_info: print(i) keys() 获取字典所有的键key user_info.keys() values() 获取字典所有的值values user_info.values() items() 获取字典所有的键值对 user_info.items() 循环所有的键和值 for k,v in user_info.items(): print(k) print(v) clear 清除所有内容 get (重要) 根据key去获取值,如果key不存在,可以指定一个默认值; 与索引取值的区别:索引取值时,key不存在会报错 ,所以工作中推荐用get方法 #有值的时候val = user_info.get('age') print(val)>>> 33#没有值的时候val = user_info.get('dfsggda') print(val)>>> None has_key 检查字典中指定key是否存在 ret = 'age' in user_info.keys()print(ret) >>> true del 删除指定索引的键值对

优秀的个人博客,低调大师

Python基础练习三超市存包柜模拟(优化)

题目描述 模拟超市存包柜的存放物品和取出物品操作,存放物品时选择空储物格,然后分配密码即为存放完成;取出物品时,输入对应的密码,打开对应的箱门即为取出物品 题目分析 1.增加私有变量,练习私有变量的使用2.多处需要进行数据类型转换,如int(),str()等3.字符串的拼接和截取,截取使用的是切片的方式4.密码采用了随机密码+位置码的方式,这样既能直接根据密码定位箱子位置,同时避免了随机生成的重复密码问题 代码 本次主要优化了check_cell()方法、save_goods()方法、get_goods_out()方法,其中get_goods_out()方法改动最大,取消了for循环,提高了查找性能。 #!/usr/bin/python3 #-*- coding:UTF-8 -*- import random ''' 模拟超市存包柜程序,设置100个箱子,存满即止 每次存放物品之前从第一个箱子检测是否为空,遇到第一个为空的即可存入物品 ''' class Locker(object): def __init__(self): self._cell_num = 100 self._use = 0 self._surplus = self._cell_num self.cell = [0]*100 def show_cell_detail(self): print(f"\n####################################\n总存包格数:总{self._cell_num}格,已用{self._use}格,剩余{self._surplus}格") def get_surplus(self): return self._surplus def check_cell(self): for i in range(0,100): position = "%02d"%(i) #将箱子位置统一格式化成2位数,不足的补0 if self.cell[i] == 0: return position return -1 #存放物品方法,先使用检查方法检查是否有空箱子,有空箱子即开门存物 def save_goods(self): self.passwd = random.randint(10000,99999) self.cell_save = self.check_cell() self.passwd = str(self.passwd) + self.cell_save #将箱子位置加入密码中,密码最后两位数代表箱子位置,同时能够避免重复密码的问题 self.cell_save = int(self.cell_save) self.cell[self.cell_save] = self.passwd print(self.cell[self.cell_save]) self._use += 1 self._surplus = self._cell_num - self._use print(f"{self.cell_save+1}号箱门已打开,您的密码是{self.cell[self.cell_save]}") #取出物品方法,输入密码,取出物品 def get_goods_out(self,password): password = str(password) i = int(password[5:7]) #直接取密码最后两位定位箱子位置,避免循环查找消耗时间 if self.cell[i] == password: print(password) self.cell[i] = 0 self._surplus += 1 self._use = self._cell_num - self._surplus return i return -1 lock = Locker() #lock.check_cell() while True: lock.show_cell_detail() surplus = lock.get_surplus() operation = input("1-存放\n2-取出\n0-退出\n请输入对应操作:") if operation == "1": if surplus != 0: lock.save_goods() else: print("箱已存满,谢谢使用") break elif operation == "2": while True: password = input("请输入取件密码:") password = int(password) out_result = lock.get_goods_out(password) if out_result != -1: print(f"{out_result+1}号箱门已打开,密码已失效,请取出物品,关好箱门") break else: print("密码错误,请核对后再输入!") elif operation == "0": print("欢迎再次光临!") break else: print("请输入正确的操作!") continue

优秀的个人博客,低调大师

Java零基础入门学习1:初探Java世界

在我们的编程世界中,Java可以说是不可或缺的一部分,它可以实现C++中很多不能实现的地方,使用也与C++有一定差别。学过C或C++的,Java上手很快。如果你之前没学过C或C++,也没关系。我呢将用通俗的语言,生活中的栗子,来帮助大家理解、学习好Java编程。 有一句经典的话:计算机编程极其困难,它要求你获得计算机科学专业的学位,需要投入几千美元来购买计算机硬件和软件,需要极强的分析能力,需要有耐心,而且对含咖啡因的饮料有强烈的爱好。 而这句话除了最后一个,全是错的。我喜欢喝可乐,并发现百事比可口好喝,这是我当程序员来最大的收获之一,尽管不是很健康。 其实,编程不难,只要有兴趣,熟练掌握没问题。当你面对计算机时,你想告诉他,I love programming! 那么,你就可以用程序来坐到它。 首先,我们需要一个编程环境,也就是IDE,集成开发环境。一个友好的IDE能使人心情舒畅,愉悦,对做题有很大的帮助。 我们在这里一律采用Netbeans,可在这里下载。 首先,新建一个项目。 然后,选择类型Java。 之后给它命名为你喜欢的名字。这里以Java_class为例。 建好之后,我们按Ctrl+n键,新建文件。 文件名命名为My_first_java_program; 打出下面的源码: 代码1.1-我的第一个Java代码-I love programming! public class My_first_java_program{ public static void main(String args[]){ System.out.println("I love programming!"); } } 我们来讲解一下这段代码: public class My_first_java_program表示声明一个类。这里的类是什么意思呢?其实,每一个Java程序都是一个类,且只有一个主类。这个My_first_java_program是类名,而类名必须和文件名相符。否则就会出现CE(编译错误的情况)。 那我们所说的编译又是什么呢?编译就是将我们所编写的代码转化为程序的工作。因为代码本身无法进行任何运算,编程就是编写程序,而不仅仅是编写代码。 在Netbeans中,F6键是编译运行,按下F6,在下边就会出现程序运行框: 这就算完成了这个程序的编辑。 那让我们回到源代码上。 public static void main是指主函数。我们的类My_first_java_program中的主函数main,它是我们程序执行的重要来源。没有main,就没有我们的程序。 目前,在我们了解public,static,void为何物之前,你只要记住,一般主函数main都要这么写。当我们学习了数据类型,类的类型之后呢,我们在对它做一定调整。 我们输出I love programming的核心语句就是:System.out.println();这是输出语句。System是系统类,out是输出流。我们要记住,输入和输出都是以流出现的。println则是输出在换行。我们在深度学习之前,也只要记住这是输出就好了。记住,你想输出的话要用 “ ” 括起来。 那么,这就是Java最初始的一个程序。今天只是让大家浅浅地了解Java,并学会编写第一个程序。下一节课我们将讲解变量与变量类型,我们下次见

优秀的个人博客,低调大师

自然语言处理入门基础之hanlp详解

自然语言处理定义: 自然语言处理是一门计算机科学、人工智能以及语言学的交叉学科。虽然语言只是人工智能的一部分(人工智能还包括计算机视觉等),但它是非常独特的一部分。这个星球上有许多生物拥有超过人类的视觉系统,但只有人类才拥有这么高级的语言。 自然语言处理的目标是让计算机处理或说“理解”自然语言,以完成有意义的任务,比如订机票购物或QA等。完全理解和表达语言是极其困难的,完美的语言理解等效于实现人工智能。 自然语言处理涉及的几个层次: 自然语言处理的几个层次 作为输入一共有两个来源,语音与文本。所以第一级是语音识别和OCR或分词(事实上,跳过分词虽然理所当然地不能做句法分析,但字符级也可以直接做不少应用)。接下来是形态学,援引《统计自然语言处理》中的定义:形态学(morphology):形态学(又称“词汇形态学”或“词法”)是语言学的一个分支,研究词的内部结构,包括屈折变化和构词法两个部分。由于词具有语音特征、句法特征和语义特征,形态学处于音位学、句法学和语义学的结合部位,所以形态学是每个语言学家都要关注的一门学科。 Hanlp自然语言处理开发包: 从事大数据方面工作的人对自然语言处理必然都是不陌生的,在Github上用户量最多的开源汉语自然语言处理工具是HanLP。HanLP的初始版本是在2014年初开发的,3月份的时候开始在Github上开源。2015年的时候集成在了大快搜索的DKNLP中,目前大快已经把DKNLP技术成果已经开源,并且整体装如HanLP项目,HanLP的版本已经到了V1.50。 Hanlp自然语言处理技术优势: 支持中文分词(N-最短路分词、CRF分词、索引分词、用户自定义词调、词性标注),命名实体识别(中国人民、音译人民、日本人民,地名,实体机构名识别),关键词提取,自动摘要,短语提取,拼音转换,简繁转换,文本推荐,依存句法分析(MaxEnt依存句法分析、神经网络依存句法分析)。提供Lucene查件,兼容Solr和ElasticSearch。 hanlp自然语言处理技术 Hanlp自然语言处理应用领域: Hanlp已经被广泛应用于Lucene、Solr、ElasticSearch、hadoop、android、Resin等平台,有大量开源作者开发各种查件与拓展,并且被包装或移植到Python、C#、R、JavaScript等语言上去。 hanlp自然语言处理应用领域 文章来源于网络

优秀的个人博客,低调大师

31道Android面试题 ,牢固你的基础

阅读目录 1.如何对 Android 应用进行性能分析 2.什么情况下会导致内存泄露 3.如何避免 OOM 异常 4.Android 中如何捕获未捕获的异常 5.ANR 是什么?怎样避免和解决 ANR(重要) 6.Android 线程间通信有哪几种方式 7.Devik 进程,linux 进程,线程的区别 8.描述一下 android 的系统架构 9.android 应用对内存是如何限制的?我们应该如何合理使用内存? 10. 简述 android 应用程序结构是哪些 11.请解释下 Android 程序运行时权限与文件系统权限的区别 12.Framework 工作方式及原理,Activity 是如何生成一个 view 的,机制是什么 13.多线程间通信和多进程之间通信有什么不同,分别怎么实现 14.Android 屏幕适配 15.什么是 AIDL 以及如何使用 16.Handler 机制 17.事件分发机制 18.子线程发消息到主线程进行更新 UI,除了 handler 和 AsyncTask,还有什么 19.子线程中能不能 new handler?为什么 20.Android 中的动画有哪几类,它们的特点和区别是什么 21.如何修改 Activity 进入和退出动画 22.SurfaceView & View 的区别 23.开发中都使用过哪些框架、平台 24.使用过那些自定义View 25.自定义控件:绘制圆环的实现过程 26.自定义控件:摩天轮的实现过程 27.GridLayout的使用 28.流式布局的实现过程 29.第三方登陆 30.第三方支付 31.进程保活 一 性能优化 1.如何对 Android 应用进行性能分析 android 性能主要之响应速度 和UI刷新速度。 可以参考博客:Android系统性能调优工具介绍 首先从函数的耗时来说,有一个工具TraceView 这是androidsdk自带的工作,用于测量函数耗时的。 UI布局的分析,可以有2块,一块就是Hierarchy Viewer 可以看到View的布局层次,以及每个View刷新加载的时间。 这样可以很快定位到那块layout & View 耗时最长。 还有就是通过自定义View来减少view的层次。 浅谈App的性能优化 Android性能优化:手把手带你全面实现内存优化 Android性能优化 (1)—— 内存溢出和内存泄漏的介绍 2.什么情况下会导致内存泄露 内存泄露是个折腾的问题。 什么时候会发生内存泄露?内存泄露的根本原因:长生命周期的对象持有短生命周期的对象。短周期对象就无法及时释放。 I. 静态集合类引起内存泄露 主要是hashmap,Vector等,如果是静态集合 这些集合没有及时setnull的话,就会一直持有这些对象。 II.remove 方法无法删除set集 Objects.hash(firstName, lastName); 经过测试,hashcode修改后,就没有办法remove了。 III. observer 我们在使用监听器的时候,往往是addxxxlistener,但是当我们不需要的时候,忘记removexxxlistener,就容易内存leak。 广播没有unregisterrecevier IV.各种数据链接没有关闭,数据库contentprovider,io,sokect等。cursor V.内部类: java中的内部类(匿名内部类),会持有宿主类的强引用this。 所以如果是new Thread这种,后台线程的操作,当线程没有执行结束时,activity不会被回收。 Context的引用,当TextView 等等都会持有上下文的引用。如果有static drawable,就会导致该内存无法释放。 VI.单例 单例 是一个全局的静态对象,当持有某个复制的类A是,A无法被释放,内存leak。 3.如何避免 OOM 异常 首先OOM是什么? 当程序需要申请一段“大”内存,但是虚拟机没有办法及时的给到,即使做了GC操作以后 这就会抛出 OutOfMemoryException 也就是OOM Android的OOM怎么样? 为了减少单个APP对整个系统的影响,android为每个app设置了一个内存上限。 publicvoidgetMemoryLimited(Activity context) { ActivityManager activityManager =(ActivityManager)context.getSystemService(Context.ACTIVITY_SERVICE); System.out.println(activityManager.getMemoryClass()); System.out.println(activityManager.getLargeMemoryClass()); System.out.println(Runtime.getRuntime().maxMemory()/(1024*1024)); } HTC M7实测,192M上限。512M 一般情况下,192M就是上限,但是由于某些特殊情况,android允许使用一个更大的RAM。 如何避免OOM 减少内存对象的占用 I.ArrayMap/SparseArray代替hashmap II.避免在android里面使用Enum III.减少bitmap的内存占用 inSampleSize:缩放比例,在把图片载入内存之前,我们需要先计算出一个合适的缩放比例,避免不必要的大图载入。 decode format:解码格式,选择ARGB_8888/RBG_565/ARGB_4444/ALPHA_8,存在很大差异。 IV.减少资源图片的大小,过大的图片可以考虑分段加载 内存对象的重复利用 大多数对象的复用,都是利用对象池的技术。 I.listview/gridview/recycleview contentview的复用 II.inBitmap 属性对于内存对象的复用ARGB_8888/RBG_565/ARGB_4444/ALPHA_8 这个方法在某些条件下非常有用,比如要加载上千张图片的时候。 III.避免在ondraw方法里面 new对象 IV.StringBuilder 代替+ 4.Android 中如何捕获未捕获的异常 CrashHandler 关键是实现Thread.UncaughtExceptionHandler 然后是在application的oncreate里面注册。 5.ANR 是什么?怎样避免和解决 ANR(重要) ANR->Application Not Responding 也就是在规定的时间内,没有响应。 三种类型: 1). KeyDispatchTimeout(5 seconds) —主要类型按键或触摸事件在特定时间内无响应 2). BroadcastTimeout(10 seconds) —BroadcastReceiver在特定时间内无法处理完成 3). ServiceTimeout(20 seconds) —小概率类型 Service在特定的时间内无法处理完成 为什么会超时:事件没有机会处理 & 事件处理超时 怎么避免ANR ANR的关键 是处理超时,所以应该避免在UI线程,BroadcastReceiver 还有service主线程中,处理复杂的逻辑和计算 而交给work thread操作。 1)避免在activity里面做耗时操作,oncreate & onresume 2)避免在onReceiver里面做过多操作 3)避免在Intent Receiver里启动一个Activity,因为它会创建一个新的画面,并从当前用户正在运行的程序上抢夺焦点。 4)尽量使用handler来处理UI thread & workthread的交互。 如何解决ANR 首先定位ANR发生的log: 04-0113:12:11.572I/InputDispatcher(220): Applicationisnot responding:Window{2b263310com.android.email/com.android.email.activity.SplitScreenActivitypaused=false}. 5009.8ms since event,5009.5ms since waitstarted CPUusage from4361msto699ms ago ----CPU在ANR发生前的使用情况04-0113:12:15.872E/ActivityManager( 220):100%TOTAL:4.8% user +7.6% kernel +87% iowait04-0113:12:15.872E/ActivityManager( 220): CPUusage from3697msto4223mslater:-- ANR后CPU的使用量 从log可以看出,cpu在做大量的io操作。 所以可以查看io操作的地方。 当然,也有可能cpu占用不高,那就是 主线程被block住了。 6.Android 线程间通信有哪几种方式 1)共享变量(内存) 2)管道 3)handle机制 runOnUiThread(Runnable) view.post(Runnable) 7.Devik 进程,linux 进程,线程的区别 Dalvik进程。 每一个android app都会独立占用一个dvm虚拟机,运行在linux系统中。 所以dalvik进程和linux进程是可以理解为一个概念。 你真正了解Java虚拟机吗—高级开发必备《深入了解Java虚拟机》 8.描述一下 android 的系统架构 从小到上就是: linux kernel,lib dalvik vm ,application framework, app 9.android 应用对内存是如何限制的?我们应该如何合理使用内存? activitymanager.getMemoryClass() 获取内存限制。 关于合理使用内存,其实就是避免OOM & 内存泄露中已经说明。 10. 简述 android 应用程序结构是哪些 1)main code 2) unit test 3)mianifest 4)res->drawable,drawable-xxhdpi,layout,value,mipmap mipmap 是一种很早就有的技术了,翻译过来就是纹理映射技术. google建议只把启动图片放入。 5)lib 6)color 11.请解释下 Android 程序运行时权限与文件系统权限的区别 文件的系统权限是由linux系统规定的,只读,读写等。 运行时权限,是对于某个系统上的app的访问权限,允许,拒绝,询问。该功能可以防止非法的程序访问敏感的信息。 12.Framework 工作方式及原理,Activity 是如何生成一个 view 的,机制是什么 Framework是android 系统对 linux kernel,lib库等封装,提供WMS,AMS,bind机制,handler-message机制等方式,供app使用。 简单来说framework就是提供app生存的环境。 1)Activity在attch方法的时候,会创建一个phonewindow(window的子类) 2)onCreate中的setContentView方法,会创建DecorView 3)DecorView 的addview方法,会把layout中的布局加载进来。 13.多线程间通信和多进程之间通信有什么不同,分别怎么实现 线程间的通信可以参考第6点。 进程间的通信:bind机制(IPC->AIDL),linux级共享内存,boradcast, Activity 之间,activity & serview之间的通信,无论他们是否在一个进程内。 14.Android 屏幕适配 屏幕适配的方式:xxxdpi, wrap_content,match_parent. 获取屏幕大小,做处理。 dp来适配屏幕,sp来确定字体大小 drawable-xxdpi, values-1280*1920等 这些就是资源的适配。 wrap_content,match_parent, 这些是view的自适应 weight,这是权重的适配。 Android屏幕适配框架-(今日头条终极适配方案) 15.什么是 AIDL 以及如何使用 Android Interface Definition Language AIDL是使用bind机制来工作。 参数: java原生参数 String parcelable list & map 元素 需要支持AIDL 16.Handler 机制 参考:android 进程/线程管理(一)——消息机制的框架这个系类。 17.事件分发机制 android 事件分发机制 带你一起探究Android事件分发机制, 让面试提问不在畏惧! Android触摸事件分发机制完全解析《一》 18.子线程发消息到主线程进行更新 UI,除了 handler 和 AsyncTask,还有什么 EventBus,广播,view.post, runinUiThread 但是无论各种花样,本质上就2种:handler机制 + 广播 你真正了解UI线程更新的几种方式吗,面试必备之深度揭秘 19.子线程中能不能 new handler?为什么 必须可以。子线程 可以new 一个mainHandler,然后发送消息到UI Thread。 带你一步一步深入Handler源码,拿下面试官不在话下 Handler消息机制完全解析(三)—Handler解析 Handler消息机制完全解析(二)MessageQueue的队列管理 Handler消息机制完全解析(一)Message中obtain()与recycle()的来龙去脉 20.Android 中的动画有哪几类,它们的特点和区别是什么 视图动画,或者说补间动画。只是视觉上的一个效果,实际view属性没有变化,性能好,但是支持方式少。 属性动画,通过变化属性来达到动画的效果,性能略差,支持点击等事件。android 3.0 帧动画,通过drawable一帧帧画出来。 Gif动画,原理同上,canvas画出来。 具体可参考:https://i.cnblogs.com/posts?categoryid=672052 21.如何修改 Activity 进入和退出动画 overridePendingTransition 22.SurfaceView & View 的区别 view的更新必须在UI thread中进行 surfaceview会单独有一个线程做ui的更新。 surfaceview 支持open GL绘制。 二项目框架的使用 23.开发中都使用过哪些框架、平台 I.EventBus 事件分发机制,由handler实现,线程间通信 II.xUtils->DbUtils,ViewUtils,HttpUtils,BitmapUtils III.百度地图 IV.volley V.fastjson VI.picciso VII.友盟 VIII.zxing IX.Gson 24.使用过那些自定义View pull2RefreshListView 25.自定义控件:绘制圆环的实现过程 publicclassCycleViewextendsView{ Paint mPaint =newPaint();publicCycleView(Context context){this(context,null); }publicCycleView(Context context, AttributeSet attrs){super(context, attrs); initView(); }privatevoidinitView(){ mPaint.setAntiAlias(true); mPaint.setStyle(Paint.Style.STROKE); mPaint.setStrokeWidth(20); } @OverrideprotectedvoidonDraw(Canvas canvas){super.onDraw(canvas); canvas.drawCircle(100,100,50,mPaint); } } 关键是canvas.drawCycle & paint.setsytle(stoken) 26.自定义控件:摩天轮的实现过程 参考链接 https://github.com/danylovolokh/LondonEyeLayoutManager 27.GridLayout的使用 参考链接 https://blog.csdn.net/k316378085/article/details/52316633 28.流式布局的实现过程 参考链接 https://blog.csdn.net/sz237812861/article/details/78383484?locationNum=4&fps=1 29.第三方登陆 参考链接 https://blog.csdn.net/alpha58/article/details/75210753 30.第三方支付 参考链接 https://blog.csdn.net/androidstarjack/article/details/72669394 【干货】微信支付,银联支付,支付宝支付——三大支付总结你get到了吗 31.进程保活 参考链接 2018年Android的保活方案效果统计 原文发布时间为:2018-10-9 本文作者:yuer 本文来自云栖社区合作伙伴“终端研发部”,了解相关信息可以关注“终端研发部”。

优秀的个人博客,低调大师

Python3基础——运算符、数据类型

一、Python 3 的数据类型 Python之所以简单,是因为赋值一个变量的时候,不需要定义这个变量的数据类型。 Python3的六个标准数据类型:Number数字型、string字符串、list列表、tuple元组、sets集合、dictionary字典。 二、Number数字型 1、Number数字型包含:int整形、float浮点型、bool布尔型、complex复数型。 1-1、整型(int):例如 a = 10 1-2、布尔型(bool):True、False 1-3、浮点型(float):round(float,ndigits) 其中float代表数字,ndigits代表精度。规则:四舍六入。 示例: a = 3.1415926 m = round(a,3) print(m) 结果:m=3.14 二、Python 运算符 2-1、数字运算符: +加、-减、*乘、/除、%余数 2-2、关系运算符:等于==、不等于!=、大于>、小于<、大于等于>=、小于等于<= 2-3、赋值运算符:=、+=、-=、*=、/= 2-4、逻辑运算符:and、or、not 三、字符串 及 使用方法 1、字符串可以使用单引号、双引号、三引号来定义;推荐使用双引号。 同时使用反斜杠(\)转义特殊字符。 2、字符串的常用方法 2-1、find 查找字符串,如果找到,返回字符串开始的下标;如果未找到,返回 -1 示例1:输出结果为 4 示例2: 输出结果为 g 示例3:输出结果为 -1 2-2、replace 替换字符串 示例1: 输出结果为Nsdfghjklcvb 示例2:输出结果为HQghjklcvb 2-3、split 分隔符(将字符串分割并返回列表) 示例: 输出结果为 2-4、strip 去除字符串前后的空字符 示例: 输出结果为asdf 2-5、format 格式化字符串 示例:输出结果为 2-6、join 将序列中的元素以指定的字符连接生成新的字符串 示例:输出结果为 3、在Python中,注释用 井 标识,其后面的内容都会被Python解释器忽略。也可以在头文件后面直接添加字符串来解释说明该项目或文件的作用(如图)。 推荐在写功能或函数的时候都要添加注释说明功能,给后期开发和代码重构提供很大帮助。 四、列表list() 及 常用方法 1、列表 list 是Python中使用最频繁的数据类型。 列表中元素的类型可以不同,支持数字、字符、甚至可以嵌套列表。 列表的写法:写在方括号[ ]中,中间使用逗号隔开元素。 1、在列表末尾增加一个元素append 示例 输出 2、删除一个元素(默认删除列表末尾),返回删除的元素 pop(index=none) 示例: 输出: 99 和 a 3、删除指定元素remove 示例: 结果: 4、返回该元素的下标 index 示例: 结果:2 5、正排序sort()与反序reverse() 示例: 结果: 6、insert 在指定位置插入一个新的元素 格式为insert(index,value) 示例: 结果: 7、截取切片[头下标:尾下标] 头下标从0开始,-1 为从末尾的位置开始。 示例: 结果: 8、enumerate函数:使列表中下标与value对应 示例: 结果: 五、元组tuple 及使用方法 1、元组tuple:就是不能增删改,只能查的特殊list。 写在小括号()里,元素之间用逗号隔开。 列表中元素的类型可以不同,支持数字、字符。 示例1: 结果为: 示例2:结果为: 说明:当元组中只有一个元素时,一定要写逗号,否则无法识别是 tuple 类型。 2、元组的使用方法 2.1 count(value) 统计value的个数 2.2 index(value) 返回第一个value的下标(和list 类似) 示例:结果: 六、字典 dict 及其使用方法 1、字典:可以存储任意对象,也可以是不同的数据类型。 2、字典的定义方法:有三种(前两种比较常用),如下 结果: 3、使用方法: 3.1 get(key) 根据key获取对应的value ;如果key不存在,则返回 None 3.2 setdefault(key,value) 根据key获取对应的value,如果key不存在,则设定默认的value 示例: 结果: 4、keys() 获得所有的key 示例: 结果: 5、values() 获得所有的value 示例: 结果: 6、iteritems 将字典中的每个 key 与 value 对应 示例: 结果: 或者可以写成: 则结果更清晰: 7、update 更新字典(与 list中的 + 相似) 示例: 结果: 8、pop(key) 删除key对应的元素,返回key对应的value值 示例: 结果: 七、查看 及 转换 数据类型 1、查看数据类型 type() 2、判断数据类型 isinstance 3、数据类型之间的转换 tuple(s) 将列表s转换为一个元组 int(x) 将x转换为整形 str(x) 将x转换为字符串 chr(x) 将整形x转换为字符

资源下载

更多资源
优质分享App

优质分享App

近一个月的开发和优化,本站点的第一个app全新上线。该app采用极致压缩,本体才4.36MB。系统里面做了大量数据访问、缓存优化。方便用户在手机上查看文章。后续会推出HarmonyOS的适配版本。

Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

用户登录
用户注册