字典代替switch
字段不仅仅可以使用 [‘key’] 获取值,也可以使用 .get(‘key’,’默认value’) 获取
def dosometh1():
return 'dosometh1'
def dosometh2():
return 'dosometh2'
def dosometh3():
return 'dosometh3'
dict_1 = {
'0': dosometh1,
'1': dosometh2
}
# 使用get方式取值
t = dict_1.get('1', dosometh3)
print(t())
列表推导式
列表、set, dict、元组 都可以被推导
a = [1, 2, 3, 4, 5, 6, 7]s
# 每个参数平方
b = [i ** 2 for i in a]
# 对大于5的数字取平方
c = [i ** 2 for i in a if i >= 5]
# 得到的也可以不仅仅是列表,也可以是set等,修改返回数据中括弧
b = (i ** 2 for i in a)
print(b)
print(c)
dict推导式编写
# 提取key
students = {
'a': 18,
'b': 20,
'c': 22
}
b = [k for k, v in students.items()]
print(b)
# 颠倒key,value
students = {
'a': 18,
'b': 20,
'c': 22
}
b = [{v: k} for k, v in students.items()]
print(b)
推导出的可以编写为元组,但是返回的不是直接的元组类型,而是generater类型
迭代器
class Book:
pass
# 若想实现迭代器,需要实现两个方法
# __next__(self)
# __iter__(self)
class BookCollection:
def __init__(self):
self.data = ['a', 'b', 'c']
self.cur = 0
def __next__(self):
if self.cur >= len(self.data):
raise StopIteration()
r = self.data[self.cur]
self.cur += 1
return r
def __iter__(self):
return self
books = BookCollection()
#
for book in books:
print(book)
# 迭代器只能遍历一次,第二次不会打印
# 如果想要多次,需要在遍历之前,进行拷贝
# import copy
# b = copy.copy(book)
for book in books:
print(book)
# 使用next函数
# print(next(books))
# print(next(books))
# rint(next(books))
# 使用__next__()方法
# print(books.__next__())
# print(books.__next__())
# print(books.__next__())
生成器
# 生成器
# print 0~10000
# 消耗内存
nn = [i for i in range(0, 10001)]
print(nn)
# 不消耗内存,并且节约资源
def gen(max):
n = 0
while n <= max:
n += 1
# 生成器
# 相当于把n返回回去了,第二次在执行时接着执行
yield n
g = gen(10000)
#
# for i in g:
# print(i)
print(next(g))
print(next(g))
print(next(g))
None
None是NoneType类型,None就是None,不等于空字符串、不等于空的列表、不等于0、不等于False 如果要做判空操作,使用 not 或者直接值去判断
a = []
if not a:
xxx
else:
xxx
if a is None:
xxx
else:
xxx
在用对象做判断时,对象不一定就是True,也有可能是False
class Test:
# 有bool方法使用bool方法
# 但是bool方法返回只能是Bool类型返回值
def __bool__(self):
return False
# 没有bool方法使用len方法
# 返回值需要是int和bool类型
def __len__(self):
return 0
# len()方法对对象使用时,也会调用__len__方法
# len()调用对时候必须申明__len__方法,不然会报错
print(bool(Test()))
装饰器弊端
def f1():
"""
This is f1
"""
print(f1.__name__)
# 如果使用装饰器对f1()进行了装饰,那么打印出来的
# 就不是f1了,而是装饰器函数的名字,并且相关help信息也没了(调用:help(f1) )
# 如何解决:
import time
from functools import wraps
def decorator(func):
# 添加注解,拷贝原始函数信息到wrapper函数内部
@wraps(func)
def wrapper():
print(time.time())
func()
return wrapper
@decorator
def f1():
"""
test
:return: s
"""
print(f1.__name__)
f1()
print(help(f1))
海象运算符3.8
定义’ := ‘
# 冗余代码问题
a = '123'
if len(a) > 5:
print(f'长度大于5;真实长度{b}')
x = len(a)
xxx
# 运算并赋值
if (b = len(a)) > 5:
print("长度为 : "+ str(b))
x = b
xxx
数据类 dataclass
# 传统赋值需要在__init__方法中传入参数再赋值到实例变量
class Student:
def __init__(self, name, age, school_name):
self.name = name
self.age = age
self.school_name = school_name
def test(self):
print(self.name)
student = Student('123',18,'sdfs')
student.test()
dataclass
from dataclasses import dataclass
# 自动重写init方法、repr方法(相当于java的toString())
@dataclass
class Student:
name: str
age: int
school_name: str
# def __init__(self, name, age, school_name):
# self.name = name
# self.age = age
# self.school_name = school_name
def test(self):
print(self.name)
student = Student('123', 18, 'sdfs')
student.test()