基础
数据结构
整型
浮点数
字符串
空值 ⇒ none
变量 ⇒ 引用关系
常量 ⇒ 全部大写的变量名表示常量(习惯)
除法 ⇒ 注意 **/** 与 **//** 的区别
字符编码
ASCII ⇒ GB2312 ⇒ Unicode ⇒ UTF-8
ASCII同时也是UTF-8的一种
计算机内存统一使用Unicode,当要存储或传输,转为UTF-8
浏览网页时,服务器将Unicode转为UTF-8传输到客户端
在Python中,字符串以Unicode编码
在编写代码时候,为了避免中文乱码,可以指定为UTF-8
!/usr/bin/env python3
-- coding: utf-8 --
List与truple
list [a,b,c]
可以增删修改元素,append() pop() len()
truple (a,b,c)
一旦初始化则不能修改,但其实不能变的只是结构,具体引用的内容时可变的,换句话说只是元素指向不变
执行逻辑
if...elif..else
while
for..in..
break, continue
dict与set
dict
定义:d = {'Michael': 95, 'Bob': 75, 'Tracy': 85}
get(用get,当不存在时不会报错) pop 方法
set
定义:s = set([1, 2, 3])
add remove
其他
input()获取的是string对象,如果需要处理还需转换
函数
定义函数 def, 空函数时可用pass,输入参数类型检测可以用isinstance(x, (int, float))。返回多个值时 return a,b 实际返回truple的对象
参数
默认参数,注意***默认参数必须指向不可变对象***,因为在函数定义时默认参数的值已经被计算出,如果函数改变了参数的值,在下一次调用时这个值也会是被改变的。
可变参数,def calc(*numbers) 。当需要将list或者truple传入,则在她们前面加\*即可。
关键字参数,def person(name, age, **kw)。kw传入key-value对。
命名关键字参数,如果要限制关键字参数的名字,就可以用命名关键字参数,def person(name, age, *, city, job),\*后面的参数被视为命名关键字参数。
参数组合,参数定义的顺序必须是:必选参数、默认参数、可变参数、命名关键字参数和关键字参数。
def f1(a, b, c=0, *args, **kw):
print(‘a =’, a, ‘b =’, b, ‘c =’, c, ‘args =’, args, ‘kw =’, kw)
def f2(a, b, c=0, *, d, **kw):
print(‘a =’, a, ‘b =’, b, ‘c =’, c, ‘d =’, d, ‘kw =’, kw)
递归与溢出
其他特性
切片
迭代
for...in...。dict迭代的是key。如果要迭代value,可以用for value in d.values(),如果要同时迭代key和value,可以用for k, v in d.items()。用isinstance('abc', Iterable)判断是否可进行迭代。for i, value in enumerate(['A', 'B', 'C']) 可以对下标进行迭代
列表生成
[x * x for x in range(1, 11) if x % 2 == 0]。其实已经比较类似java8的特性了。、
生成器
用来处理无限循环的类型
1. 把列表生成的[]换成(), g = (x * x for x in range(10)), next(g)或者for n in g
2. 函数return改为yield
迭代器
注意使用迭代器是不知道迭代对象的长度,只能通过不断next来寻找。
函数式编程
(这里已经非常类似java8了)
概述
变量可以指向函数,通过变量名即可调用函数。
函数名同时也是变量,可以作为参数传递。
函数可以接受函数为变量。
def add(x, y, f):
return f(x) + f(y)
f=abs
高阶函数
lambda表达式,匿名函数,下面例子多为lambda表达式。
map/reduce
from functools import reduce
list(map(str, [1, 2, 3, 4, 5, 6, 7, 8, 9]))
reduce(add, [1, 3, 5, 7, 9])
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))
filter
print(list(filter(lambda x:x>3, [1,2,3,4,5])))
sort
sorted([36, 5, -12, 9, -21], key=abs)
sorted(['bob', 'about', 'Zoo', 'Credit'], key=str.lower)
sorted(['bob', 'about', 'Zoo', 'Credit'], key=str.lower, reverse=True)
返回函数与懒加载
函数不需要立即求值,需要在后面的计算中进行求值,所以函数的返回值是一个函数。换言之,函数调用两次才出结果
def lazy_sum(*args):
def sum():
ax = 0
for n in args:
ax = ax + n
return ax
return sum
f = lazy_sum(1, 3, 5, 7, 9)
f()
当返回函数包含内部变量时,返回函数的内部变量还会被新函数所使用。
返回函数时,计算并未执行,而是调用到最终函数才会执行。
装饰器
这部分我觉得还是挺好玩的。wrapper函数是封装函数。
封装函数需要被定义为wrapper函数。
wrapper的参数定义应该是(*args, **kw),因此,wrapper()函数可以接受任意参数的调用。
如果需要装饰器decorator本身有参数传入,则需要编写一个返回decorator的高阶函数。
def showName(func):
def wrapper():
print("Before function exec: ")
return func()
return wrapper
@showName
def func():
print("Function execution")
def log(text):
def decorator(func):
print("This is "+ text + "log \nFunction is:" +func.__name__)
def wrapper():
print("This is wrapper")
return func();
return wrapper
return decorator
@log('rudi')
def fun():
print("Function execution")
fun()
偏函数
functools.partial的作用就是,把一个函数的某些参数给固定住(也就是设置默认值),返回一个新的函数,调用这个新函数会更简单
import functools
int2 = functools.partial(int, base=2)
模块
作用域
类似__xxx__这样的变量是特殊变量,可以被直接引用,但是有特殊用途,比如上面的__author__,__name__就是特殊变量,hello模块定义的文档注释也可以用特殊变量__doc__访问,我们自己的变量一般不要用这种变量名;
类似_xxx和__xxx这样的函数或变量就是非公开的(private),不应该被直接引用,比如_abc,__abc等;
也就是说__XXX的函数是private函数。
def _private_1(name):
return 'Hello, %s' % name
def _private_2(name):
return 'Hi, %s' % name
def greeting(name):
if len(name) > 3:
return _private_1(name)
else:
return _private_2(name)
模块安装
pip install Pillow
其他常用的第三方库还有MySQL的驱动:mysql-connector-python
用于科学计算的NumPy库:numpy
用于生成文本的模板工具Jinja2
模块搜索
1. 一是直接修改sys.path,添加要搜索的目录:
import sys
sys.path.append('/Users/michael/my_py_scripts')
2. 设置环境变量PYTHONPATH,该环境变量的内容会被自动添加到模块搜索路径中。
面向对象
IO
进程
模块
Web开发