一, 生成器
生成器是什么? 其实和 list 差不多, 只不过 list 生成的时候数据已经在内存里面了, 而生成器中生成的数据是当被调用时才生成呢, 这样就节省了内存空间.
1, 列表生成式, 在第二篇博客里面我写了三元运算符, 和那个有点像, 如果要生成列表 ['01', '02', '03', ..., '10'] 怎么做? 除了循环还可以用一行语句代替循环生成.
list = [str(i).zeffill() for i in range(1,11)]
生成器: 要创建一个 generator, 有很多种方法. 第一种方法很简单, 只要把一个列表生成式的 [] 改成(), 就创建了一个 generator.
- g=(x*x for x in range(1,11))
- print(g)
- <generator object <genexpr> at 0x1036ff258># 运行结果
创建 list 和 generator 的区别仅在于最外层的 [] 和().list 的元素我们可以一个个打印出, 如果要打印 generator 中的元素需要借助 next 方法
- g=(x*x for x in range(1,11))
- print(next(g))
- print(next(g))
- print(next(g))
- print(next(g))
但是 generator 保存的是算法, 每次调用 next(g), 就计算出 g 的下一个元素的值, 直到计算到最后一个元素, 没有更多的元素时, 抛出 StopIteration 的错误. 可以通过 for 循环来迭代它, 并且不需要关心 StopIteration 的错误.
- g=(x*x for x in range(1,11))
- for i in g:
- print(i)
二, 常用内置函数
- # print(all([1,2,3,4,5]))# 是否可迭代的对象中的所有元素都为真
- # print(any([0,1]))# 判断该对象中是否有一个为真
- # print(bin(4))# 十进制转二进制 二进制的格式为: 0b100->1*2+0*1+0*0 以 0b 为开头标志
- # print(bool(''))# 将一个对象转换为布尔类型, 以空格为对象返回的也是 True, 没什么大用处
- # print(bytearray('abcdefg',encoding='utf-8'))# 将字符串转换成 byte 格式
- # print(bytearray())
- # print(bytearray(12))
- # print(callable('adsf'))# 判断该对象是否可被调用, 暂时未发现有什么用途
- # print(chr(65))# 打印数字对应得 ascii A, 换句话就是将数字转化成对应的 ascii
- # print(chr(97))# 打印数字对应得 ascii a
- # print(ord('m'))# 打印字符对应的 ascii 码值 109
- # print(dict(s='m',m='ss'))# 将键值对的格式转换成字典
- # print(dir('sd'))# 打印对象可调用的的方法
- # # ### 非常实用, 当不知道某个对象有哪些方法是可以通过此查看函数
- # print(filter(lambda x:x>5,[12,3,12,2,1,2,35]))# 把后面的迭代对象根据前面的方法筛选
- # print(map(lambda x:x>5,[1,2,3,4,5,6]))
- print(random.randint(1,9))# 一次性随机取一个数字
- print(random.sample(range(1,9),3))# 一次性随机取三个数字
- print(globals())# 返回程序中所有的变量
- print(globals())# 返回程序内所有的变量, 返回的是一个字典
- print(locals())# 返回局部变量
- print(hash('aaa'))# 把一个字符串哈希成一个数字
- print(hex(111))# 数字转成 16 进制 #16 进制格式: 0o157
- print(max(111,12))# 取最大值
- print(oct(111))# 把数字转换成 8 进制
- print(round(11.11,2))# 取几位小数
- print(sorted([2,31,34,6,1,23,4]))# 排序
- dic={1:2,3:4,5:6,7:8}
- print(sorted(dic.items()))# 按照字典的 key 排序
- print(sorted(dic.items(),key=lambda x:x[1]))# 按照字典的 value 排序
- __import__('decorator')# 导入一个模块
三, 匿名函数
如果这个函数只执行一次的话, 那就可以定义一个匿名函数, 匿名函数只能处理比较简单的处理逻辑, 只能写简单的表达式, 不能写循环 判断, 比如三元运算符.
匿名函数定义使用 lambda 关键字, 比如说要定义一个函数, 它的功能是返回两个数相加和, 就可以使用 lambda, 代码如下:
- s = lambda x,y:x+y# 冒号号前面的 x,y 是入参, 冒号后面的是返回值
- print(s(1,9))# 因为函数即变量, 如果没有定一个变量把 lambda 存起来的话, 它就不在内存里, 没法执行, 所有把它放到 s 这个变量里面
四, json 处理
json 是一种所有语言中都通用的 key-value 数据结构的数据类型, 很像 python 中的字典, json 处理使用 json 模块, json 模块有下面常用的方法:
- import json
- dic = {"name":"niuniu","age":18}
- print(json.dumps(dic))# 把字典转成 json 串
- fj = open('a.json','w')
- print(json.dump(dic,fj))# 把字典转换成的 json 串写到一个文件里面
- s_json = '{"name":"niuniu","age":20,"status":true}'
- print(json.loads(s_json))# 把 json 串转换成字典
- fr = open('b.json','r')
- print(json.load(fr))# 从文件中读取 json 数据, 然后转成字典
python 学习笔记(四): 生成器, 内置函数, json
来源: http://www.bubuko.com/infodetail-2673199.html