Python

Python
沐飞官方文档
https://docs.python.org/zh-tw/3.7/library/functions.html#abs
语法
input
1 | s = input('birth: ') |
注释
1 | #这是注释符 |
代码块 :
当语句以冒号:
结尾时,缩进的语句视为代码块
坚持使用4个空格的缩进
1 | a = 100 |
数据类型
整型
可以使用_
对比较长的数进行分割,效果一样
1 | 100000000 100_000_000 |
浮点数
科学计数法:把10用e代替 1.23x109就是1.23e9
,或者12.3e8
整数运算永远是精确的(除法也是精确的),而浮点数运算则可能会有四舍五入的误差。
字符串
转义字符
1 | print("I\'m ok") |
Python还允许用
r''
表示''
内部的字符串默认不转义
换行
除了“\n” Python允许用
'''...'''
的格式表示多行内容
1 | print('''line1 |
布尔值
Ture False
and or not
1 | True and True |
空值
空值是Python里一个特殊的值,用None
表示。None
不能理解为0
,因为0
是有意义的,而None
是一个特殊的空值。
变量
1 | a = 1 |
常量
1 | PI = 3.14 |
除法
/
除法计算结果是浮点数整数的地板除
//
永远是整数
乘法
1 | r**2 #表示r的2次方 |
字符串
单个字符的编码,Python提供了ord()
函数获取字符的整数表示,chr()
函数把编码转换为对应的字符:
1 | ord('A') |
由于Python的字符串类型是str
,在内存中以Unicode表示,一个字符对应若干个字节。如果要在网络上传输,或者保存到磁盘上,就需要把str
变为以字节为单位的bytes
。
Python对bytes
类型的数据用带b
前缀的单引号或双引号表示:
1 | x = b'ABC' |
要注意区分
'ABC'
和b'ABC'
,前者是str
,后者虽然内容显示得和前者一样,但bytes
的每个字符都只占用一个字节。
1 | 'ABC'.encode('ascii') |
encode()
可以将unicode
编码为指定的byte
如果要在网络上传输,或者保存到磁盘上
decode()
可以将byte
转化为unicode
网络或磁盘上读取了字节流
转化过程
byte
只有一小部分无效字节,可以传入*errors*='ignore'
忽略错误的字节
在操作字符串时,我们经常遇到
str
和bytes
的互相转换。为了避免乱码问题,应当始终坚持使用UTF-8编码对str
和bytes
进行转换。
1 | print(b'\xe4\xb8\xad'.decode('utf-8',errors='ignore')) |
获取长度
1 | len()#计算str有多少个字符,会先转化为Unicode码 |
声明utf-8编码
在.py文件开头写上
1 | #!/usr/bin/env python3 |
申明了UTF-8编码并不意味着你的
.py
文件就是UTF-8编码的,必须并且要确保文本编辑器正在使用UTF-8 without BOM
编码
整理sort(),替换repalce(‘A’,’a’)
对于不可变对象如str,b = a.replace(‘A’,’a’),a不会改变,而是创建一个新的对象,被b指向
格式化
1 | print('hello,%s'%('me')) #类比C/C++ |
占位符 | 替换内容 |
---|---|
%d | 整数 |
%f | 浮点数 |
%s | 字符串 |
%x | 十六进制整数 |
小数整数位数,补0
1 | print('%2d-%02d'%(3,1)) |
字符串里有%
用%%
转义
format()
1 | print('hello,{0},成绩提升了 {1:.1f}'.format('小明',17.2)) |
它会用传入的参数依次替换字符串内的占位符{0}
、{1}
……,
f-string
1 | 2.5 r = |
list数组[]
特点:可变的有序列表
每个数据类型可以不同
a[0] a[1] a[2] 第一个,第二个,第三个数据
a[-1] a[-2] a[-3] 倒一个,倒二个,倒三个数据
a.append() 结尾添加元素
a.insert(1,’jack’) 把元素插入到序列位置1,之前的后移
a.pop() 删除末尾元素 a.pop(i)删除序列位置为i的元素
1 | 'python', 'java', ['asp', 'php'], 'scheme'] s = [ |
tuple指向不变的数组()
classmates这个tuple不能变了,它也没有append(),insert()这样的方法。
其他获取元素的方法和list是一样的,
提高代码安全性
1 | classmates = ('Michael', 'Bob', 'Tracy') |
1 | 1,) t = ( |
“可变的”tuple
1 | >>> t = ('a', 'b', ['A', 'B']) |
变的是tuple里的list
条件判断
1 | age = 3 |
注意缩进和冒号
循环
for-in
类比C\C++的for(auto e:name)
1 | names = ['Michael', 'Bob', 'Tracy'] |
range(5)生成序列0~4
1 | list(range(5)) |
1 | sum = 0 |
while
1 | sum = 0 |
break contiune
与C\C++相同
dict字典{} key-value
查询速度快,通过key计算位置的算法称为哈希算法(Hash)
dict的key必须是不可变对象(list无法用作key)
两种存入方式
1 | 'Michael': 95, 'Bob': 75, 'Tracy': 85} d = { |
1 | 'Jack'] = 90 d[ |
判断Key是否存在
一是通过in
判断key是否存在:
1 | 'Thomas' in d |
二是通过dict提供的get()
方法,如果key不存在,可以返回None
,或者自己指定的value:
1 | 'Thomas') d.get( |
删除key
1 | d = {'Michael': 95, 'Bob': 75, 'Tracy': 85} |
set
set和dict类似,也是一组key的集合,但不存储value。由于key不能重复,所以,在set中,没有重复的key。
1 | #要创建一个set,需要提供一个list作为输入集合: |
添加元素add()
1 | s.add(4)#添加重复的没有效果 |
删除元素remove()
1 | s.remove(4) |
数学意义
无序和无重复元素的集合,因此,两个set可以做数学意义上的交集
、并集
等操作
1 | set([1, 2, 3]) s1 = |
函数
函数定义
1 | def my_abs(x): |
空函数
1 | def nop(): |
参数检查
1.参数个数不对时
TypeError
: my_abs() takes 1 positional argument but 2 were given
2.数据类型检查可以用内置函数isinstance()
实现
1 | def my_abs(x): |
返回多个值
1 | import math |
返回值其实是一个tuple
1 | import math |
默认参数
1 | def enroll(name, gender, age=6, city='Beijing'): |
除了按顺序填入参数,也可以不按顺序填入参数只要把参数名写出来enroll('Adam', 'M', city='Tianjin')
默认参数的误用
默认参数必须指向不变对象
1 | def add_end(L=[]): |
可变参数
1 | def calc(*numbers):#*numbers表示定义可变参数 |
关键字参数
关键字参数允许你传入0个或任意个含参数名的参数,这些关键字参数在函数内部自动组装为一个dict
。
1 | #声明格式 |
1 | #直接填入 |
**extra
表示把extra
这个dict的所有key-value用关键字参数传入到函数的**kw
参数,kw
将获得一个dict,注意kw
获得的dict是extra
的一份拷贝,对kw
的改动不会影响到函数外的extra
。
命名关键字参数
检查关键字参数是否存在
1 | def person(name, age, **kw): |
命名关键字参数必须传入参数名,这和位置参数不同。如果没有传入参数名,调用将报错:
1 | def person(name,age,*,city,birth): |
和关键字参数
**kw
不同,命名关键字参数需要一个特殊分隔符*
,*
后面的参数被视为命名关键字参数。
如果函数定义中已经有了一个可变参数,后面跟着的命名关键字参数就不再需要一个特殊分隔符*
了:
1 | def person(name, age, *args, city='Beijing', job): |
组合参数
参数定义的顺序必须是:必选参数、默认参数、可变参数、命名关键字参数和关键字参数。
1 | def f1(a, b, c=0, *args, **kw): |
递归函数
1 | def fact(n): |
高级特性
切片
1 | L[起始位置:终止位置:步程] #0可以忽略 |
迭代(遍历)
for in可以遍历list,tuple,和dict,字符串等可迭代对象
dict默认遍历前面的数
如果要迭代value,可以用for value in d.values()
,如果要同时迭代key和value,可以用for k, v in d.items()
判断一个对象是可迭代对象
方法是通过
collections.abc
模块的Iterable
类型判断
1 | from collections.abc import Iterable |
for in 使用两个变量
enumerate
函数可以把一个list
变成索引-元素对,这样就可以在for
循环中同时迭代索引和元素本身:
1 | for i, value in enumerate(['A', 'B', 'C']): |
1 | for x, y in [(1, 1), (2, 4), (3, 9)]: |
列表生成式
1 | print([x*x for x in range(1,11)]) |
前面的if是表达式,它必须根据x
计算出一个确切结果
后面的if是筛选条件
生成器
一边循环一边计算的机制,称为生成器:generator。,保存的是表达式
1.只要把一个列表生成式的[]
改成()
1 | for x in range(10)] L = [x * x |
读取值
1 | next(g) |
1 | for x in range(10)) g = (x * x |
斐波拉契数列用列表
1 | def lib(max): |
a, b = b, a + b
相当于
t = (b, a + b) # t是一个tuple
a = t[0]
b = t[1]
将函数改为generator
添加yield
1 | def odd(): |
执行顺序
与普通函数不一样,在每次调用next()
的时候执行,遇到yield
语句返回,再次执行时从上次返回的yield
语句处继续执行。
注意
1 | o = odd() |
1 | next(odd()) |
使用捕获异常来捕获generator的return的返回值
1 | g = fib(6) |
生成杨辉三角
1 | def triangles(): |
迭代器
可以被next()
函数调用并不断返回下一个值的对象称为迭代器:Iterator
。
可以使用isinstance()
判断一个对象是否是Iterator
对象
生成器都是
Iterator
对象,但list
、dict
、str
虽然是Iterable
,却不是Iterator
。
将Iterable
变成Iterator
把list
、dict
、str
等Iterable
变成Iterator
可以使用iter()
函数:
1 | isinstance(iter([]), Iterator) |
高阶函数
把函数作为参数传入,这样的函数称为高阶函数
1 | f = abs() |
map()
map()
函数接收两个参数,一个是函数,一个是Iterable
,map
将传入的函数依次作用到序列的每个元素,并把结果作为新的Iterator
返回。
1 | def f(x): |
可以使用list()
将惰性序列r
的所有结果计算出来
reduce()
reduce
把一个函数作用在一个序列[x1, x2, x3, ...]
上,这个函数必须接收两个参数
reduce
把结果继续把序列的下一个元素做为形参,然后调用函数
1 | reduce(f, [x1, x2, x3, x4]) = f(f(f(x1, x2), x3), x4) |
1 | from functools import reduce |
结合使用
1 | reduce(fn,map(char2num,'123123')) |
#python