流畅的Python笔记.1
图源Unplash
数据结构
容器序列
只能容纳一种类型
扁平序列
存值而不是引用,是一段连续的内存空间,看起来是会更加的紧凑.但是只能放字符,字节和数值这种基础的类型.
可变序列
list,生成器的表达式可以用来创建任何类型的序列,它本身没有容器结构,存粹实现了迭代的功能,这是它实现的内在.
生成器表达式
背后遵守了迭代器的协议,可以逐个的产出元素,而不是建立一个完整的列表,然后在把这个列表传递到某个构造函数里面。和列表表达式的区别是方括号变成圆括号
只用推导式去生成一个新的列表.超过两行的推导式就考虑重新写吧.有点复杂了.其内部使用的变量作用域Σ(っ °Д °;)っ就是其本身,所以看起来是相对封闭的环境,不会和外界的 *同名* 变量产生关系.
x='ABC'
dummy=[ord(x) for x in x]
print(x)
不可变的序列
元组其实是对数据的记录:元组中的每一个元素都存放了记录中一个字段的数据,外加这个字段的位置。位置信息赋予了数据的意义。也就是说,一旦数据的价值是和位置关联起来的时候,那赋予不变动的能力就是一个很重要的事情了。拆包可以让元组完美的当作记录来使用。
元组拆包
这个可以应用带任何可以迭代的对象上面去。唯一的硬性要求是,被可迭代对象中的元素数量必须根接受这些元素的元组的空档数是一致的。其实可迭代的元素拆包这个说法也流行起来了。
最好的辨认方法就是平行赋值,也就是一个可迭代对象里的元素,一并赋值到对应的变量组成的元组中。
一个栗子就是:
b,a=a,b
b,a=(a,b)
也可以使用*运算符号把一个可迭代对象拆开作为函数的参数。在函数的形参里面经常可以看到:
fun(*args,**kwargs)
其中*args是一个元组,**kwargs是一个字典类型的元组。作用就是把一个元组拆成一个一个的元素。写到了这里,一定要注意顺序:
fun(arg,*args,**kwargs)
一定要按照这个来写,否则会出现错误。
还有一个用法就是可以让一个函数可以用元组的形式返回多个值,然后调用函数的代码就可以轻松的接受这些返回值。
import os
_,filename=os.path.split(r'C:\Users\yunswj\Desktop\笔记\快捷键.md')
print(filename)
结果必然是(快捷键.md),这里给变成链接了。继续说,我们不是对元组里面的所有的数据都感兴趣,这个时候占位符就是一个很不错的做法了。
在平行赋值里面,*前缀只能用在一个变量名字的前面,但是这个变量可以出现在赋值表达式的任意位置。
元组已经很棒啦!但是要是作为一种记录工具的话,还是缺少一点功能,那就是给记录里面field去命名。我们这个使用nametuple来解决。他是一个工厂函数,来构建一个带字段的元组和一个名字的类。创建一个具名的元组需要两个参数,一个是类名,一个是类的哥哥字段的名字。后者可以是由数个字符串组成的可迭代的对象,或者是由空格分隔开的字段名组成的字符串。