写这篇博客原因是前天的面试,一道很简单的算法题,我却做的很复杂,归其原因就是自己虽然把廖老师的python课程简单过了一遍,但很多东西也是看了就忘了,所以通过写这篇博客,用几天时间再过一遍。
一、python基础
1.1 数据类型和变量 int float str bool
1.2 字符串和编码
ord() 显示字符的十进制形式
chr() 把编码转化为对应的字符串
encode(‘utf-8’) 指定编码
decode() 把bytes变为str
1.3 列表list >>> L = ['Apple', 123, True]
append()
insert()
pop()
1.4 元组 >>> classmates = ('Michael', 'Bob', 'Tracy')
不可修改
1.5 条件和循环 for while
if <条件判断1>:
<执行1>
elif <条件判断2>:
<执行2>
else:
<执行3>
1.6 字典dict和set
1)字典{key-value}
直接通过key就可以放入值
get(key) 获取value值
pop() 删除2)set() set和dict类似,也是一组key的集合,但不存储value。由于key不能重复,所以,在set中,没有重复的key。
二、函数
2.1 默认参数 (defaul arg),与默认值相同时可以不用说明
可变参数(*arg),传入的参数个数是可变的
*nums表示把nums这个list的所有元素作为可变参数传进去。这种写法相当有用,而且很常见
2.2 递归和尾递归
递归
def recursion(x):
if x == 0:
return 0
else:
return x+recursion(x - 1)
print(recursion(3))
尾递归
def recursion(x , total=1):
if x == 1:
return total
else :
return recursion(x-1,total + x)
print(recursion(100))
区别在哪儿?
普通递归每计算一步,都需要生成一个新的recursion(x-1),并不知道它的值是多少,所以会占用一个新的栈,但尾递归是把变化的参数传递给递归函数的变量了,比如从recursion(5)->recursion(4),这一步仍然调用的是递归函数本身,故不用占用新的栈内存。
-are you ok? do you understand? -yeah!
三、高级特性
3.1切片
3.2迭代
java中迭代是通过下标,但python中只要是可迭代对象都能迭代,比如dict。
>>> from collections import Iterable
>>> isinstance('abc', Iterable) # str是否可迭代
True
3.3迭代生成式
[x * x for x in range(1, 11) if x % 2 == 0]
3.4生成器
受到内存限制,列表容量肯定是有限的。故可以不必创建完整的list,从而节省大量的空间。在Python中,这种一边循环一边计算的机制,称为生成器:generator。
如果一个函数定义中包含yield关键字,那么这个函数就不再是一个普通函数,而是一个generator
3.5 迭代器 Iterator
Iterator的计算是惰性的,只有在需要返回下一个数据时它才会计算。
四、函数式编程
允许把函数本身作为参数传入另一个函数,还允许返回一个函数.
4.1 高阶函数
一个函数就可以接收另一个函数作为参数,这种函数就称之为高阶函数。
4.2 map/reduce
map()
map()函数接收两个参数,一个是函数,一个是Iterable,map将传入的函数依次作用到序列的每个元素,并把结果作为新的Iterator返回
>>> def f(x):
... return x * x
>>> r = map(f, [1, 2, 3, 4, 5, 6, 7, 8, 9])
>>> list(r) #返回的结果也是迭代器
[1, 4, 9, 16, 25, 36, 49, 64, 81]
reduce()
再看reduce的用法。reduce把一个函数作用在一个序列[x1, x2, x3, …]上,这个函数必须接收两个参数,reduce把结果继续和序列的下一个元素做累积计算,其效果就是:
reduce(f, [x1, x2, x3, x4]) = f(f(f(x1, x2), x3), x4)
lambda函数
def char2num(s):
return {'0': 0, '1': 1, '2': 2, '3': 3, '4': 4, '5': 5, '6': 6, '7': 7, '8': 8, '9': 9}[s]
def str2int(s):
return reduce(lambda x, y: x * 10 + y, map(char2num, s))
4.3 filter() 筛选函数
filter()也接收一个函数和一个序列。和map()不同的是,filter()把传入的函数依次作用于每个元素,然后根据返回值是True还是False决定保留还是丢弃该元素。filter()函数返回的是一个Iterator。
4.4 sorted() 排序函数
sorted(iterable, key=None, reverse=False)
4.5 返回函数
内部函数sum可以引用外部函数lazy_sum的参数和局部变量,当lazy_sum返回函数sum时,相关参数和变量都保存在返回的函数中,这种称为“闭包(Closure)”的程序结构拥有极大的威力。
4.6 匿名函数
lambda args: 表达式
print(list(map(lambda x,y:x+y,[1,2,4],[1,2,7])))
4.7 装饰器
4.8 偏函数