文章目录
python里面有许多很python的语句!——简单、明了且优雅
还有一些python的优化机制、垃圾回收机制。
做个小汇总。
1.数值交换
像c++/c 、java都用一个中间变量tmp
去交换变量a
、b
的值:
tmp = a
a = b
b = tmp
但在python中,一行搞定:
a,b = b,a
看看最经典斐波那契数列的写法:
def fib(n):
a, b = 0, 1
while a < n:
print(a, end=' ')
a, b = b, a+b
fib(1000)
"""
输出:0 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987
"""
2.隐式的判断
显示判断,就是说有判断==True/False
if a == True:
pass
if a == False:
print(a)
但是,在python中可以去掉==False/True
也就是会隐式判断(==True
)
if a:
print('True','a')
if not a:
print('False','a')
3.生成列表/字典/集合
假设,要生成一个列表/集合,列表/集合元素:字母a-z。
你还再手动的一个字母一个字母的写到列表/集合里面麽?
alphabets_list=['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z']
alphabets_set={'e', 'a', 'o', 'u', 'f', 'w', 'r', 'h', 'k', 'm', 'g', 't', 'y', 'p', 's', 'd', 'x', 'j', 'l', 'n', 'c', 'b', 'v', 'i', 'z', 'q'}
别这样,让我们解放双手:
alphabets_list = [i for i in 'abcdefghijklmnopqrstuvwxyz']
alphabets_set = {i for i in 'abcdefghijklmnopqrstuvwxyz'}
假设,要生成一个字典,键值对时:{小写字母:大写字母}
就酱紫:
alphabets_dicts = {i:j for i,j in zip('abcdefghijklmnopqrstuvwxyz','ABCDEFGHIJKLMNOPQRSTUVWXYZ')}
(zip 函数:——一个内置函数)
# zip函数,就是将输入的参数的元素变成一组组的元组(tuple)
# 举个🌰
a=[1,2,3,4,5]
b=(6,7,8,9,10)
c='偷偷打螺丝'
d={1,2,3,4,5}
zz=zip(a,b,c,d)
print(list(zz))
# 输出:
[(1, 6, '偷', 1), (2, 7, '偷', 2), (3, 8, '打', 3), (4, 9, '螺', 4), (5, 10, '丝', 5)]
4.三目运算符
嘿嘿嘿,用很多种方法确认handsome :
name = "一起偷偷打螺丝"
handsome = "一起偷偷打螺丝" if name else "who else?" # 1
handsome2= name =="一起偷偷打螺丝" and '一起偷偷打螺丝' or 'who else?' # 2
handsome3= ('一起偷偷打螺丝', 'who else?')[name == '一起偷偷打螺丝'] # 3
handsome4= ['一起偷偷打螺丝', 'who else?'][name == '一起偷偷打螺丝'] # 4
handsome5= {True: "一起偷偷打螺丝", False: "who else?"}[name == '一起偷偷打螺丝']
5.数据解包
数据解包是个很方便的操作,我这里点到就不展开了——看看大佬的总结——Orz
但大致有两种办法来解包,
- 变量对应
a,b,c = [1,2,3]
- 用*进行解包。
已经有一个列表了,想输出所有元素。可以只用一行代码吗?
Absolutely~
la = [i for i in "一起偷偷打螺丝吗?"]
print(la)
print(*la,sep='') # 这里的*la,是个,可迭代对象
输出:
['一', '起', '偷', '偷', '打', '螺', '丝', '吗', '?']
一起偷偷打螺丝吗?
类似的,有一个字典了,输出所有键或值。
alphabets_dicts = {i:j for i,j in zip('abcdefghijklmnopqrstuvwxyz','ABCDEFGHIJKLMNOPQRSTUVWXYZ')}
print(alphabets_dicts)
print(*alphabets_dicts,sep='') # 输出所有的键/key
print(*alphabets_dicts.values(),sep='') # 输出所有的值/values
# print(**alphabets_dicts,sep='') # 还不明白为什么这句会报错..
输出:
{'a': 'A', 'b': 'B', 'c': 'C', 'd': 'D', 'e': 'E', 'f': 'F', 'g': 'G', 'h': 'H', 'i': 'I', 'j': 'J', 'k': 'K', 'l': 'L', 'm': 'M', 'n': 'N', 'o': 'O', 'p': 'P', 'q': 'Q', 'r': 'R', 's': 'S', 't': 'T', 'u': 'U', 'v': 'V', 'w': 'W', 'x': 'X', 'y': 'Y', 'z': 'Z'}
abcdefghijklmnopqrstuvwxyz
ABCDEFGHIJKLMNOPQRSTUVWXYZ
5.1 连接列表
la = [i for i in 'abcdefghijklmnopqrstuvwxyz']
lb = [i for i in 'ABCDEFGHIJKLMNOPQRSTUVWXYZ']
print("la + lb: ",la + lb)
print("[*la, *lb]: ", [*la,*lb])
5.2 合并字典
a = {'a': 1, 'b': 2}
b = {'c': 5, 'd': 6, 'b': 3}
print("{**a, **b}",{**a, **b})
# python 3.9 的新炫技
print("a | b :", a | b)
6.小整数对象池子
众所周知,python里面所有的数据结构、基本类型、变量、常量、。。。都是对象。
那如果两个对象的值都一样呢?
比如 a = 1 , b = 1
, 会不会这两个对象,在内存的地址 id()
一样呢?
a = 1
b = 1
print(id(1))
print(id(a))
print(id(b))
输出:
1973776836912
1973776836912
1973776836912
三者id一致。
这是一种优化,为了避免重复对相同的数据申请和销毁内存空间
小整数范围[-5,256]
(下图是python自带的IDEA,但是在Pycharm里面会有进一步的优化,范围更大。)
- 小整数对象会被实现建立好,不会被回收,为变量赋值的时候,直接指向这些建立好的地址。
上面谈到是整型类型的数据,但相应的,对于字符串也是有 “小整数对象”
s1 = '一起偷偷打螺丝'
s2 = '一起偷 偷打螺丝' # 多了个空格
print(id('一起偷偷打螺丝'))
print(id(s1))
print(id(s2))
输出:
2322412652848
2322412652848
2322412652944 # id变了
所以,多了一个空格,id就变了,就是个新对象了。
- 字符串中没有空格或者其他特殊符号,就是一个 “不会被回收” 的 “小整数对象”
7.Python中垃圾回收
Python中收废品的人物叫做:Python解释器。
除了解释执行python语句,还身兼多职,比如回收内存中冗余的对象空间。
这很Python,让开发人员从内存管理是事务中解脱出来。
- 采用
引用计数(reference count)
的机制,跟踪、回收垃圾。 - 在引用计数基础上,再用
标记--清除(mark and sweep)
解决容器对象可能产生的循环引用问题 - 通过
分代回收(generation collection)
,空间换时间,提高回收效率。
end