~~~~~~这很Python~~~~~~

python里面有许多很python的语句!——简单、明了且优雅

还有一些python的优化机制、垃圾回收机制。

做个小汇总。


1.数值交换

像c++/c 、java都用一个中间变量tmp去交换变量ab的值:

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

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

adingable

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值