Python
It's personal python note
引言
有两种方式构建软件设计:
一种是把软件做的很简单以至于明显找不到缺陷;
另一种是把它做得很复杂以至于找不到明显的缺陷.
--by C.A.R Hoare
标识符
- 第一个字符必须是字母或下划线
- 大小写敏感
list []
- python内置的一种数据类型
- 有序
- append()追加、insert()插入、pop()剃尾或删除
- list里数据类型可不同
- list还可以嵌套使用
tuple ()
- 与list类似,但一旦被初始化则不可以改变
- 在定义中若只有一个元素时,需在后面追加逗号。tuple(1,)
控制语句
- if 判断
- for...in 循环
- while 循环
dict {}
- 字典,相当于map
- dict的key必须是不可变对象
set ([])
- 一组key的集合,但不存储value,key不重复
函数 def
- 函数的返回值用return语句返回
- 空函数
如果想定义一个什么事也不做的空函数,可以用pass语句. - 参数检查
数据类型检查可以用内置函数isinstance()实现
def my_abs(x):
if not isinstance(x, (int, float)):
raise TypeError('bad operand type')
if x >= 0:
return x
else:
return -x
- 返回多值
Python的函数返回多值其实就是返回一个tuple,但写起来更方便。 - 默认参数
def power(x, n=2):
s = 1
while n > 0:
n = n - 1
s = s * x
return s
注意必选参数在前,默认参数在后
默认参数必须指向不变对象
- 可变参数
在Python函数中,还可以定义可变参数。顾名思义,可变参数就是传入的参数个数是可变的,可以是1个、2个到任意个,还可以是0个。
例:给定一组数字a,b,c……,请计算a2 + b2 + c2 + ……
def calc(*numbers):
sum = 0
for n in numbers:
sum = sum + n * n
return sum
>>> calc(1, 2, 3)
14
>>> calc()
0
>>> nums = [1, 2, 3]
>>> calc(*nums)
14
- 关键字参数
关键字参数允许你传入0个或任意个含参数名的参数,这些关键字参数在函数内部自动组装为一个dict。
def person(name, age, **kw):
print('name:', name, 'age:', age, 'other:', kw)
>>> person('Michael', 30)
name: Michael age: 30 other: {}
>>> person('Bob', 35, city='Beijing')
name: Bob age: 35 other: {'city': 'Beijing'}
>>> person('Adam', 45, gender='M', job='Engineer')
name: Adam age: 45 other: {'gender': 'M', 'job': 'Engineer'}
>>> extra = {'city': 'Beijing', 'job': 'Engineer'}
>>> person('Jack', 24, **extra)
name: Jack age: 24 other: {'city': 'Beijing', 'job': 'Engineer'}
关键字作用是扩展函数。
- 命名关键字检查
def person(name, age, **kw):
if 'city' in kw:
# 有city参数
pass
if 'job' in kw:
# 有job参数
pass
print('name:', name, 'age:', age, 'other:', kw)
如果要限制关键字参数的名字,就可以用命名关键字参数,例如,只接收city和job作为关键字参数。这种方式定义的函数如下:
def person(name, age, *, city, job):
print(name, age, city, job)
- 参数组合
在Python中定义函数,可以用必选参数、默认参数、可变参数、关键字参数和命名关键字参数,这5种参数都可以组合使用,除了可变参数无法和命名关键字参数混合。但是请注意,参数定义的顺序必须是:必选参数、默认参数、可变参数/命名关键字参数和关键字参数。
递归函数
def fact(n):
if n==1:
return 1
return n * fact(n - 1)
- 使用递归函数需要注意防止栈溢出。
- 解决递归调用栈溢出的方法是通过尾递归优化。尾递归是指,在函数返回的时候,调用自身本身,并且,return语句不能包含表达式。这样,编译器或者解释器就可以把尾递归做优化,使递归本身无论调用多少次,都只占用一个栈帧,不会出现栈溢出的情况。
def fact(n):
return fact_iter(n, 1)
def fact_iter(num, product):
if num == 1:
return product
return fact_iter(num - 1, num * product)
高级特性
- 切片
取一个list或者tuple或者字符串的部分元素的操作。
>>> L[0:3]
>>> (0, 1, 2, 3, 4, 5)[:3]
>>> 'ABCDEFG'[:3]
- 迭代
- 列表生成式
列表生成式即List Comprehensions,是Python内置的非常简单却强大的可以用来创建list的生成式。 - 生成器 generator
- 迭代器