阅读本文大概需要 10 分钟。
提要
哈喽,大家好!继续分享我整理的一些Python3笔记
。
TL;DR
* 赋值
* 迭代
* 函数
* 作用域
* 参数
* 函数式编程工具
# 序列赋值
nudge = 1
wink = 2
A, B = nudge, wink # 元组赋值
print(A, B)
[C, D] = [nudge, wink] # 列表赋值
print(C, D)
nudge, wink = wink, nudge # 数值交换
print(nudge, wink)
# 赋值语句右侧支持任意的可迭代对象
[a, b, c] = (1, 2, 3)
print(a, b, c)
(a, b, c) = "KFC"
print(a, b, c)
((a, b), c) = ('SP', 'AM') # 支持嵌套
print(a, b, c)
a, b, c = 'TRUMP' # 右侧元素要与左侧变量保持数目相同
seq = [1, 2, 3, 4]
a, *b = seq
print(a, b)
*a, b = seq
print(a, b)
a, *b, c = seq
print(a, b, c)
a, b, c, *d = seq
print(d)
a, b, c, d, *e = seq
print(e)
*a, = seq
print(a)
# 多目标赋值是将最右侧的对象依次赋值给左侧所有的名称
# 要记住,在这里只有一个对象,但是由三个变量共享
a = b = c = []
print(a is b is c)
a.append(42)
print(a, b, c)
# += 对于列表而言是原位置修改
M = L = [1, 2]
M += [3, 4]
print(M, L)
# + 总是会产生新的对象
M = L = [1, 2]
M = M + [3, 4]
print(M, L)
f = open('myfile.txt', 'r', encoding='utf-8')
print(f.readline())
print(f.readline())
print(f.readline())
print(f.readline())
f.close()
# 手动调用迭代协议
f = open('myfile.txt', 'r', encoding='utf-8')
i = iter(f)
print(next(i))
print(next(i))
print(next(i))
print(next(i))
f.close()
f = open('myfile.txt', 'r', encoding='utf-8')
print(f is iter(f))
l = [1, 2, 3]
print(l is iter(l))
i = input('please input i:')
if i == '1':
def m(i):
return i ** 3
elif i == '2':
def m(i):
return i + 100
else:
def m(i):
return i ** 10
print(m(int(i)))
# 默认情况下,
# 一个赋值(X = value)会创建或改变当前作用域中的变量名 X
X = 88
def func():
X = 99
print('inner', X)
func()
print('outer', X)
# global 声明会将变量映射至外层模块
X = 88
def func():
global X
X = 99
print('inner', X)
func()
print('outer', X)
# X 在函数运行前的外围模块中并不存在,
# 函数内的第一条赋值语句将自动在模块中创建 X 这个变量
def func():
global X
X = 99
print('inner', X)
func()
print('outer', X)
# 闭包
def count():
cnt = 0
def counter():
nonlocal cnt
cnt += 1
return cnt
return counter
counter = count()
print(counter())
print(counter())
print(counter())
print(counter())
# 循环变量可能需要默认值参数,而不是作用域(这里有点类似ES3的闭包问题)
def makeActions():
acts = []
for i in range(5):
acts.append(lambda x: i ** x)
return acts
acts = makeActions()
print('------')
print(acts[0](2))
print(acts[1](2))
print(acts[2](2))
def makeActions2():
acts = []
for i in range(5):
acts.append(lambda x, i=i: i ** x)
return acts
acts2 = makeActions2()
print('------')
print(acts2[0](2))
print(acts2[1](2))
print(acts2[2](2))
def f(a, b, c):
print(a, b, c)
f(1, 2, 3)
f(c=3, b=2, a=1)
f(1, c=3, b=2)
def f(a, b=2, c=3):
print(a, b, c)
f(1)
f(a=1)
f(1, 4)
f(1, c=6) # 允许你跳过定义 b
def f(*pargs, **kargs):
print(pargs, kargs)
f(1, 2, 3, a=1, b=2, c=3)
f(*[1, 2, 3], **{
'a': 1,
'b': 2,
'c': 3
})
# keyword-only 参数——必须只按照关键字传入
# 并且永远不会被基于位置参数来填充的参数
def func(a, *b, c):
print(a, b, c)
func(1, 2, 3, c=4)
func(1, c=4)
func(1)
from functools import reduce
L = [1, 2, 3, 4]
M = map(lambda x: x * 10, L)
print(list(M))
N = filter(lambda x: x > 2, L)
print(list(N))
O = reduce(lambda x, y: x+y, L)
print(O)
参考:
《Python学习手册 原书第五版 上册》