python语言那些...
2019-02-16 本文已影响10人
霡霂976447044
-
值传递还是引用传递
引用传递,只是在遇到传递不可变对象时像值传递。
对于不可变对象的函数传参,依然是传的引用(地址)。对于简单类型,在函数内对其操作之所以不会影响函数范围外的值,是因为运算中的赋值操作产生了新的对象,而不是对原有对象的改变。而对于一些复杂类型,就可以比较清晰的看出,函数内参数的改变同样会影响函数外的变量。 -
*args **kwargs
def foor(*args **kwargs)
bar(*args **kwargs)
# * 以元组的方式传递, **以键值对
形参名叫args不叫args, bar(args **kwargs) 称为自动解包
- property的应用
class Goods(object):
def __init__(self):
# 原价
self.original_price = 100
# 折扣
self.discount = 0.8
@property
def price(self):
# 实际价格 = 原价 * 折扣
new_price = self.original_price * self.discount
return new_price
@price.setter
def price(self, value):
self.original_price = value
@price.deleter
def price(self):
del self.original_price
obj = Goods()
obj.price # 获取商品价格
obj.price = 200 # 修改商品原价
del obj.price # 删除商品原价
-
thread的join的daemon
join(timeout)方法的作用是,等待子线程执行完,会阻塞主线程后面的代码。
daemon属性设置为True时,主线程执行完,子线程也会停止。设置为False时,主线程执行完,会等待子线程执行完。
join是直接阻塞主线程,daemon是设置执行完后是否阻塞。 -
列表切片
x = [i/2 for i in range(4, 49)]
x[::2] # 每两个取一个
- 列表表达式
x = [i/2 for i in range(4, 49)]
y = [random.randint(20, 35) for i in range(120)] # 产生120个随机数,范围在20-35之间
x3 = ["10点{}分".format(i) for i in range(60)]
-
导包问题
from 导包只能import子一级的模块或者对象
相对路径导包方法的name 不能是main
多次相同的导包不会覆盖
导同一个包有多种方式可能会造成多次导包 -
GIL全局锁
GIL全局锁是python解释器的问题,在CPython解释器里面,同一时刻只能一个线程在运行。
并不容易解决这个问题。
对于开发者来说, 在IO密集用多线程还是有效的,如果需要更加高效的,可以使用多进程,其他java解释器。或者其它语言实现。