python进阶学习记录(1)

本文记录了Python进阶学习的内容,包括关键字的理解、面向对象特性,特别是枚举类的使用。深入探讨了生成器和迭代器的概念,以及它们在惰性计算中的作用。此外,还介绍了进程与线程的区别,强调了进程间通信和线程同步的重要性,如使用lock保护临界资源。
摘要由CSDN通过智能技术生成

关键字

global

在全局作用域下存在一个全局变量,但是在局部作用域下对相同的函数名进行赋值了,意味一个新的变量,那么刚开始想要的是对全局赋值,就需要使用global

def modify_a():
	global a
	a = 30

if __name__ == '__main__':
	a = 1
	modify_a()
	print(a) # 30

nonlocal

有时候在一个嵌套函数内使用了外部函数的变量,如果只是读取不会有影响,但是赋值的话就会有影响

def bar():
	a = 10
	def foo():
		nonlocal a
		a += 1
		print(a)
	return foo
	
bar()() # 11

面向对象

__slots__

python中对象都是动态创建的,可以直接对任意一个对象未知的属性进行赋值,这样就动态创建了这个属性,但是在定义类的时候,并不需要这样,可以使用__slots__来类来进行限制

class Human():
	__slot__ = ("name", "age")
	def __init__(self, name:str, age:int):
		self.name = name
		self.age = age
if __name__ == "main":
	people = Human("xiaoming", 12)
	people.like = 12

枚举类

定义一系列常量的时候可以使用枚举,尤其规定状态的时候

  • 无法改变,不重复
  • 枚举的意义在定义的name
  • 枚举不可用来作比较,可以使用is来比较身份
  • 注意如果值相同,后面的会成为第一个的别名,因此可以使用unique
    from enum import Enum, unique
    
    @unique
    class VIP(Enum):
    	BLACK = 0
    	YELLO = 1
    	RED = 2
    
    # 使用
    VIP.RED # VIP.RED
    # 获取名
    VIP.RED.name # RED
    # 获取值
    VIP.RED.value # 2
    

@property

@property对类的属性进行getter,setter

class Human():
	__slot__ = ("name", "age")
	def __init__(self, name:str, age:int):
		self.name = name
		self._age = age
	
	@property
	def age(self):
		return self._age
	
	@age.setter
	def age(self, age):
		self._age = age

if __name__ == "main":
	people = Human("xiaoming", 12)
	people.like = 12

生成器,迭代器

生成器

  • 生成值的一种机制
  • yield, 普通函数和生成器函数就差一个关键字yield,用来返回生成的值
    # 斐波拉契数列为例
    def fb(num):
    # n 代表计数, a 表示上一个值, b 表示前两个值之和
    n, a, b = 0, 0, 1
    while n < num:
    	
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值