前言时刻:
继续码字,今天学习了生成器的概念以及内置函数,概念性很强,多理解多练习。
总结一波:
生成器、列表推导式、内置函数:ord,chr,len,help,hash等
1、生成器
一般都会把生成器和迭代器进行对比,很多人都认为生成器和迭代器是一样的。但是还是有点区别,生成器本质上就是迭代器,不同是生成器是用户自行构造的一个迭代器,而迭代器是 Python 内部预先设定好的如:文件句柄fp。
至于生成器的优点和迭代器是一样的,都是省内存,速度快等。
创建生成器的三种方式:生成函数、
1.1 生成函数:
return
和 yield
的区别,只要函数中有 yield
,那么这个函数就被称为生成器函数。而 return 是作为函数中的中断和返回作用。
# 1.1 生成函数 def func(): yield (1) yield (2) yield (3) return 6 f = func() print(f) # <generator object func at 0x7fc6e9941ba0> print(next(f)) # 1 print(next(f)) # 2 print(next(f)) # 3
1.2 使用列表
使用列表元素作为生成的数据:yield from list
。
# 1.2 使用列表 def func(): yield from [1, 2, 3] print(666) return 7 f = func() print(f) # <generator object func at 0x7fc6e9941ba0> print(next(f)) # 1 print(next(f)) # 2 print(next(f)) # 3
2、推导式
2.1 列表推导式
这个列表推导式很简洁很高大上,用来装逼不错,但是复杂情况下不推荐用,因为不容易排查错误。
列表推导式语法:
[加工数据x for x in iterator if 条件]
直接上手写例子:
- 求1到10中所有偶数的平方添加到列表中?
lis = [x**2 for x in range(1, 10) if x&1==0] # lis = [x**2 for x in range(2, 10, 2)] # 或者使用range中的步长或者切片步长也可 print(lis) # [4, 16, 36, 64]
2.2 字典推导式
和列表推导式语法几乎一样,就是符号不一样。
{加工数据x: 加工数据y for x, y in iterator if 条件}
例子:
# 字典推导式 dic = {x.upper(): y for x, y in [('name', 'python'), ('age', '18')]} print(dic) # {'NAME': 'python', 'AGE': '18'}
2.3 集合推导式
不常见,看一下有印象就好
{加工数据x for x in iterator if 条件} # 集合推导式 se = {i for i in range(6)} print(se) # {0, 1, 2, 3, 4, 5}
小结:
-
列表推导式和生成器的区别?
列表推导式是一个可迭代对象,而生成器是一个迭代器。
-
推荐使用列表推导式吗?
简单的语法推荐,复杂的不要使用,否则以后读代码真的很痛苦。
3、内置函数
常见的内置函数需要熟悉,一些不重要的的看一遍有个印象就好。
1、了解一般重要:
- eval(str):去掉字符串,运行里面的代码。但是不建议在项目用,容易被黑客注入脚本,破坏系统。
- exec(str):运行流代码,有点热加载的感觉。
- hash(str):求数据的唯一哈希值。可用于验证文件是否被修改。
- help():打印源代码和用法,如:help(list)
- callable():判断元素是否可被调用。
# 例子 # 1.eval函数 eval("print('python')") # python eval("{'name': 'python'}") # {'name': 'python'} # 2.exec函数 func_str = """ for i in range(1, 3): print(i) """ exec(func_str) # 1 2 # 3.help help(str.upper) """ Help on method_descriptor: upper(self, /) Return a copy of the string converted to uppercase. """ # 4.hash hash("123456") # -485472484214653308 # 5.callable def func(): return 666 print(callable(func)) # True print(callable("func")) # False
2、超级重要:
-
bin(binary):十进制转二进制、oct(octonary):转8进制、hex(hexadecimal):转16进制。
-
chr:ASCII码转字母,ord:字母转ASCII码
a = 18print(bin(a)) # 0b10010 0bprint(oct(a)) # 0o22 0oprint(hex(a)) # 0x12 0x# ord chrb = 'a'print(ord(b)) # 97print(chr(97)) # a
总结:
搞懂了生成器与迭代器之间的联系和区别,一些内置函数也有印象了。希望到时用到的时候,能想起来有这么个函数实现了某个功能就好。