字典代替 switch
day = 8
def get_sunday():
return 'Sunday'
def get_monday():
return 'Monday'
def get_tuesday():
return 'Tuesday'
def get_default():
return 'Unkown'
switcher = {
0: get_sunday,
1: get_monday,
2: get_tuesday
}
day_name = switcher.get(day, get_default)()
print(day_name)
列表推導式
根據(jù)一個列表創(chuàng)建一個新的列表
以 a 列表的每個元素的平方創(chuàng)建一個新列表
a = [1, 2, 3, 4, 5, 6]
b = [i*i for i in a]
print(b)
結果
[1, 4, 9, 16, 25, 36]
只用大于 3 的元素
a = [1, 2, 3, 4, 5, 6]
b = [i*i for i in a if i > 3]
print(b)
結果
[16, 25, 36]
tuple set dict 同樣可以蛤织,比如 set
a = {1, 2, 3, 4, 5, 6}
b = {i*i for i in a if i > 3}
print(b)
結果
{16, 25, 36}
用字典的 key 創(chuàng)建一個新列表
students = {'張三': 18, '小明': 19, '小黑': 20}
l = [key for key,value in students.items()]
print(l)
結果
['張三', '小明', '小黑']
互換字典的 key 和 value
students = {'張三': 18, '小明': 19, '小黑': 20}
d = {value:key for key,value in students.items()}
print(d)
結果
{18: '張三', 19: '小明', 20: '小黑'}
iterator 和 generator
可迭代對象:凡是可以被 for 循環(huán)遍歷的數(shù)據(jù)結構妻率,都是可迭代對象蔚晨。列表儿礼,元組等都是可迭代對象咖杂。
迭代器:迭代器一定是一個可迭代對象,可迭代對象不一定是迭代器蚊夫。列表诉字,元組等都不是迭代器。
普通對象擁有 __iter__
和 __next__
兩個方法知纷,可以變成一個迭代器
定義一個迭代器
import re
class BookCollection:
def __init__(self):
self.data = ['《入門》', '《出門》', '《放棄》']
self.cur = 0
def __iter__(self):
return self
def __next__(self):
if self.cur >= len(self.data):
raise StopIteration()
next_book = self.data[self.cur]
self.cur += 1
return next_book
books = BookCollection()
for book in books:
print(book)
結果
《入門》
《出門》
《放棄》
迭代器有一次性奏窑,上面遍歷過了,再次遍歷不會打印
...
books = BookCollection()
for book in books:
print(book)
# 再次遍歷
for book in books:
print(book)
結果屈扎,只有第一次遍歷埃唯,打印了
《入門》
《出門》
《放棄》
如果要再次遍歷,可以創(chuàng)建一個新的對象或者復制一個對象
...
books = BookCollection()
# 創(chuàng)建一個新的對象
books1 = BookCollection()
for book in books:
print(book)
for book in books1:
print(book)
...
books = BookCollection()
# 復制一個對象
import copy
books_copy = copy.copy(books)
for book in books:
print(book)
for book in books_copy:
print(book)
生成器
在函數(shù)中鹰晨,執(zhí)行 return
墨叛,函數(shù)就結束了。
yield
會返回一個生成器對象模蜡,生成器對象可以通過 next()
訪問漠趁,也可以遍歷
返回生成器對象之后,與 return
不同忍疾,下一次調用會接著從上一次返回的地方執(zhí)行闯传。
def gen(max):
n = 0
while n <= max:
n += 1
yield n
g = gen(10)
print(next(g))
print(next(g))
print(next(g))
結果
1
2
3
遍歷
...
g = gen(10)
for i in g:
print(i)
結果
1
2
3
4
5
6
...
dataclass
之前沒有使用 dataclass
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('張三', 18, 'python')
student.test()
使用 dataclass
from dataclasses import dataclass
@dataclass
class Student:
name: str
age: int
school_name: str
def test(self):
print(self.name)
student = Student('張三', 18, 'python')
student.test()
海象運算符
使用前
a = 'python'
if len(a) > 5:
print('長度為:' + str(len(a)))
使用后
a = 'python'
if (b:=len(a)) > 5:
print('長度為:' + str(b))
另,使用 f 關鍵字做字符串拼接
a = 'python'
if (b:=len(a)) > 5:
print(f'長度為:卤妒')