资料:廖雪峰Python教程
IDE:Spyder
数据类型
\(\stackrel{\mathrm{list}}{\text{列表}}\)
1
2L = ['Apple', 123, True] # 元素数据类型不同
s = ['python', 'java', ['asp', 'php'], 'scheme'] # list嵌套listlist中元素可变
\(\stackrel{\mathrm{tuple}}{\text{元组}}\)
1
2
3t = () # 空tuple
t = (1,) # 只有1个元素的tuple
t = ('a', 'b', ['A', 'B']) # tuple嵌套listtuple中元素不可变
\(\stackrel{\mathrm{dict}}{\text{字典}}\)
1
d = {'Michael': 95, 'Bob': 75, 'Tracy': 85} # 键-值(key-value)对应
\(\stackrel{\mathrm{set}}{\text{集合}}\)
1
2s1 = set([1, 1, 2, 2, 3, 3]) # 由list创建set
s2 = {1, 1, 2, 2, 3, 3} # set只有key, 没有valueset中元素无序
函数的参数
函数的参数包括:必选参数、默认参数、可变参数、关键字参数等
以 默认参数 + 可变参数 为例:
1 | def product(x1=None, *x2): # x1为默认参数, x2为可变参数 |
切片
Slice
原则:左闭右开
1 | L = list(range(100)) # 第0个 -> 第99个, [0, 1, 2, 3, ..., 99], 100个数 |
抽象迭代
Python的
for
循环抽象程度要高于C的for
循环1
2
3
4
5
6
7d = {'a': 1, 'b': 2, 'c': 3}
for key in d:
print(key)
for value in d.values():
print(value)
for k, v in d.items():
print(k, '=', v)通过
collections
模块的Iterable
类型判断能否迭代1
2
3
4from collections import Iterable
isinstance('abc', Iterable) # str可迭代, True
isinstance([1,2,3], Iterable) # list可迭代, True
isinstance(123, Iterable) # 整数不可迭代, FalsePython内置的
enumerate
函数可以把一个list变成索引-元素对1
2for i, value in enumerate(['A', 'B', 'C']):
print(i, value)同时引用两个变量
1
2for x, y in [(1, 1), (2, 4), (3, 9)]:
print(x, y)
列表生成式
List Comprehensions
基本用法
1
list(range(1, 11)) # [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
循环赋值
1
2
3L = []
for x in range(1, 11):
L.append(x * x) # [1, 4, 9, 16, 25, 36, 49, 64, 81, 100]循环简记
1
[x * x for x in range(1, 11)] # [1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
循环嵌套
1
[m + n for m in 'ABC' for n in 'XYZ'] # 全排列
循环 + 判断
1
[x for x in range(1, 5) if x % 2 == 0] # [2, 4]
for
后面的if
是过滤条件,不能有else
判断 + 循环
1
[x if x % 2 == 0 else -x for x in range(1, 5)] # [-1, 2, -3, 4]
for
前面的if ... else
是表达式,必须有else
高阶函数
\(\stackrel{\mathrm{higher-order}}{\text{高阶}}~\stackrel{\mathrm{function}}{\text{函数}}\):一个函数就可以接收另一个函数作为参数,这种函数就称之为高阶函数。
map/reduce
map
一般抽象1
2
3
4
5def f(x):
return x * x
list(map(f, [1, 2, 3, 4, 5])) # 抽象f, [1, 4, 9, 16, 25]
list(map(str, [1, 2, 3, 4, 5])) # 抽象str, ['1', '2', '3', '4', '5']MATLAB里的
arrayfun
或.
运算与map
的功能类似reduce
企业级抽象把一个函数作用在一个序列
[x1, x2, x3, ...]
上,这个函数必须接收两个参数,reduce
把结果继续和序列的下一个元素做累积计算1
reduce(f, [x1, x2, x3, x4]) = f(f(f(x1, x2), x3), x4) # 四个元素的伪代码
例如,将序列
[6, 3, 2, 4]
变换成整数6324
:1
2
3
4
5
6
7from functools import reduce
def fn(x, y):
return x * 10 + y
reduce(fn, [6, 3, 2, 4])
reduce(fn, [2, 7, 1, 8, 2, 8, 1, 8, 2, 8, 4, 5, 9, 0, 4]) # 再多点
filter
filter
把传入的函数依次作用于每个元素,然后根据返回值是True
还是False
决定保留还是丢弃该元素。
例如,删掉偶数,只保留奇数:
1 | def is_odd(n): |
sorted
Python内置的
sorted
函数就可以对list进行排序1
sorted([36, 5, -12, 9, -21]) # [-21, -12, 5, 9, 36]
接收一个
key
函数来实现自定义排序1
sorted([36, 5, -12, 9, -21], key=abs) # [5, 9, -12, -21, 36]
匿名函数
格式
1 | f = lambda x, y: x * x + y |
匿名函数只能有一个表达式
MATLAB中的匿名函数:
f=@(x,y) x^2+y
等价于
1 | def f(x): |
偏函数
\(\stackrel{\mathrm{partial}}{\text{偏}}~\stackrel{\mathrm{function}}{\text{函数}}\):是通过设定参数的默认值,可以降低函数调用的难度。
int()
函数提供额外的base
参数(默认值为10
),如果传入base
参数,就可以做N进制的转换:
1 | int('6324', base=8) # 3284为10进制结果 |
可以定义一个int8()
的函数,默认把base=8
传进去:
1 | def int8(x, base=8): |
利用functools.partial
创建一个偏函数:
1 | import functools |