版本Python3.8
0 开始之前
参考教程:廖雪峰Python教程,菜鸟Python教程,Learn X in Y Minutes
参考书籍:
Python编程:从入门到实践.pdf
1 基础语法
1.1 标识符
- 由字母、数字、下划线构成,数字不能作为开头
- 关键字不能作为表示符
- 大小写敏感
1.2 变量和数据类型
1.2.1 基本数据类型
Python中有六个标准数据类型,链接
- 不可变数据类型:Number(数字),String(字符串),Tuple(元组);
- 可变数据类型:List(列表),Dictionary(字典),Set(集合)。
数字类型
Python3 支持 int、float、bool、complex(复数)。
在Python 3里,只有一种整数类型 int,表示为长整型,没有 python2 中的 Long。
内置的 type() 函数可以用来查询变量所指的对象类型。
对于int类型,默认十进制,其他进制需要加前导符>>> a, b, c, d = 20, 5.5, True, 4+3j
>>> print(type(a), type(b), type(c), type(d))
<class 'int'> <class 'float'> <class 'bool'> <class 'complex'>
二进制 | 0b或0B |
---|---|
八进制 | 0o或oO |
十六进制 | 0x或0X |
注意:Python3 中,bool 是 int 的子类,True 和 False 可以和数字相加, True==1、False==0 会返回 True;在 Python2 中是没有布尔型的,它用数字 0 表示 False,用 1 表示 True。
数值运算
>>> 5 + 4 # 加法
9
>>> 4.3 - 2 # 减法
2.3
>>> 3 * 7 # 乘法
21
>>> 2 / 4 # 除法,得到一个浮点数
0.5
>>> 5 // 3 # 除法,得到一个整数
1
>>> 17 % 3 # 取余
2
>>> 2 ** 5 # 乘方
32
注意:
- Python可以同时为多个变量赋值,如a, b = 1, 2。
- 一个变量可以通过赋值指向不同类型的对象。
- 数值的除法包含两个运算符:
/
返回一个浮点数,//
返回一个整数。 - 在混合计算时,Python会把整型转换成为浮点数。
复数:a + bj 或者complex(a,b)表示,a,b均为浮点类型。
字符串
- 字符串用
'
或"
括起来。 - 用
\
转义特殊字符,在字符串前添加r
表示不转义,如print(r'Kenshin\n')
输出Kenshin\n
。 - 字符串截取格式
变量[头下标:尾下标]
。
+
是字符串的连接符,*
表示复制当前字符串,如print(2*str)
。
注意:
- Python 没有单独的字符类型,一个字符就是长度为1的字符串。
- 与 C 字符串不同的是,Python 字符串不能被改变。向一个索引位置赋值,比如word[0] = ‘m’会导致错误。
List | 列表
- 列表是写在方括号
[]
之间、用逗号分隔开的元素列表,如list = ['abcd', 123, True, 70.4]
- 列表截取格式和字符串一样,
变量[头下标:尾下标]
。 - 索引值以
0
为开始值,-1
为从末尾的开始位置。
+
是列表连接运算符,*
是重复操作。与字符串不同的是,列表的元素可以改变。
>>> a = [1, 2, 'Kenshin', 3.6]
>>> a[0] = 3
>>> a[1:] = [4, 'Oneko', 7.7]
>>> a
[3, 4, 'Oneko', 7.7]
(New)列表可以接受第三个参数,作用是设置截取步长,缺省时默认步长为1;如果步长为负数,表示逆向读取,可用于翻转字符串。
Tuple | 元组
- 元组与列表类似,但元素不能修改。元组写在
()
内。 - 索引和切片操作和列表相同。
- 元组可以包含可变的对象,如list列表。
- 包含0个或1个元素的元组写法较为特殊。
String,List 和 Tuple 都属于 Sequence(序列)。tuple1 = () #空元组
tuple2 = (3, ) #一个元素的元组
Set | 集合
- 集合是由一个或数个形态各异的大小整体组成的,构成集合的事物或对象称作元素或是成员。
用
{}
或者set()
函数创建集合,空集合必须用set()
,不能用{ }
,{ }
用来创建空字典。>>> x = set('eleven')
>>> y = set('twelve')
>>> x, y
({'l', 'e', 'n', 'v'}, {'e', 'v', 'l', 't', 'w'})
>>> x & y #交集
{'l', 'e', 'v'}
>>> x | y #并集
{'e', 'v', 'n', 'l', 't', 'w'}
>>> x - y #差集
{'n'}
>>> x ^ y #补集
{'t', 'n', 'w'}
添加和删除元素
S = set([1, 2, 2, 3, 4])
S.add(5) #添加元素
S.remove(4) #删除元素
Dictionary | 字典
字典是无序的对象集合。
- 字典用
{ }
标识,储存结构为key:value
,如dict = {key1:value1, key2:value2}
。 - 键一般唯一,若不唯一,最后一个键值会替换前面的键值。
- 键必须取不可变类型,值可以任意数据类型。
访问字典的值
dict = {'Name': 'Zara', 'Age': 7, 'Class': 'First'}
print "dict['Name']: ", dict['Name']
print "dict['Age']: ", dict['Age']
'''
输出
dict['Name']: Zara
dict['Age']: 7
'''
判断key是否存在
>>> dict = {'Name': 'Zara', 'Age': 7, 'Class': 'First'}
>>> 'Kenshin' in dict #通过in函数判断
>>> False
>>> dict.get('Name') #通过get函数判断,如果没有key,返回None,如果有,返回对应value
>>> 'Zara'
修改键值&添加和删除键值对
dict = {'Kenshin':45, 'oneko':18}
dict['Kenshin'] = 10 #修改值
dict['czl'] = 19 #添加方法1
tmp = {'憨憨':'czl'}
dict.update(tmp) #添加方法2
del[dict['Kenshin']] #删除方法1
dict.pop('oneko') #删除方法2,pop返回值是删除的键的值
dict.clear() #删除所有键对
数据类型转换
Python中数据类型转换只需将数据类型名作为函数名即可。
int(x [,base]) | 将x转换为一个整数 |
---|---|
float(x) | 将x转换到一个浮点数 |
complex(real [,imag]) | 创建一个复数 |
str(x) | 将对象 x 转换为字符串 |
repr(x) | 将对象 x 转换为表达式字符串 |
eval(str) | 用来计算在字符串中的有效Python表达式,并返回一个对象 |
tuple(s) | 将序列 s 转换为一个元组 |
list(s) | 将序列 s 转换为一个列表 |
set(s) | 转换为可变集合 |
dict(d) | 创建一个字典。d 必须是一个 (key, value)元组序列。 |
frozenset(s) | 转换为不可变集合 |
chr(x) | 将一个整数转换为一个字符 |
ord(x) | 将一个Unicode字符转换为它的整数值 |
hex(x) | 将一个整数转换为一个十六进制字符串 |
oct(x) | 将一个整数转换为一个八进制字符串 |
1.3 条件、循环
1.3.1 条件分支
if <条件判断1>:
<执行1>
elif <条件判断2>:
<执行2>
elif <条件判断3>:
<执行3>
else:
<执行4>
1.3.2 循环结构
for x in range(100):
#do somthing
while n > 0:
#do something
break
和continue
的用法和C语言一致。
1.4 基本输入/输出
str()
-
repr()
输出一个解释器可读的字符串
"'Kenshin'"
。- 可以转义字符串中的特殊字符,
s = 'Kenshin\n'``repr(s)
输出'Kenshin\n'
。 -
print
基本输出
print('Hello World')
输出Hello World
print('Hello World', 'Hello Kenshin')
输出Hello World Hello Kenshin
,逗号以空格替代。print('100 + 200 = ', 100 + 200)
输出100 +200 = 300
格式化输出
格式控制符和C语言一致。
print('Age: %d, Name: %s' % (18, 'Kenshin'))
输出Age: 18, Name: Kenshin
,Kenshin
也可用变量代替。format()
:print('Hello, {0}, 作业还有{1:.2f}%'.format('Kenshin', 99.667))
输出f-string
:print(f'{name}, 作业还有{percent:.2f}%')
,name
和percent
可被替换。input
从stdin读入字符串。
- 可以打印提示字符串,如
input("请输入:")
输出请输入:
。
1.5 函数
1.5.1 定义函数
定义一个函数要使用def
语句,依次写出函数名、括号、括号中的参数和冒号:
,然后,在缩进块中编写函数体,函数的返回值用return
语句返回。
def myAdd(a, b):
c = a + b
return c
Python中有pass
语句做占位符,可以使空函数运行起来,不加pass
会报错。
def nop():
pass
返回多个值
import math
def move(x, y, step, angle=0):
nx = x + step * math.cos(angle)
ny = y - step * math.sin(angle)
return nx, ny
x, y = move(100, 100, 60, math.pi / 6)
print(x, y) #输出151.96152422706632 70.0
r = = move(100, 100, 60, math.pi / 6)
print(r) #输出(151.96152422706632, 70.0)
实际上函数返回还是一个值,但是返回的是一个Tuple,如果用多个变量接受时,可以按顺序赋给对应的值。
1.5.2 参数
默认参数
def myPow(x, n = 1):
ans = 1
while n > 0:
n = n - 1
s = s * x
return s
myPow(2) #即为myPow(2,1)
myPow(2,5)
注意:默认参数必须在必选参数的后面。
默认参数的意义在于降低函数调用难度,尤其体现在某个参数大多一样时,可以不用传参,有不一样时,再传参。
有多个默认参数时,可以按顺序提供部分默认参数,如果不按顺序时,需要提供参数名,如default_parameter_i = value
。
看一个例子
def add_end(L = []):
L.append('end')
return L
add_end([1,2,3]) #输出[1,2,3,'end']
add_end() #输出['end']
add_end() #输出['end','end']
注意6,7两行,由于默认参数是可变对象,所以,每次传默认参数调用后,默认参数就改变了。这个例子中,将[]
改为None
即可。
默认参数必须指向不可变对象!
可变参数
Python可以在参数前加一个*
,在函数内部,参数组装为一个tuple。如:
def calc(*numbers):
sum = 0
for n in numbers:
sum = sum + n * n
return sum
calc(1, 2, 3) #输出14
calc() #输出0
items = [1, 3, 4, 5]
calc(*items) #输出51
10,11行说明了在已有一个list或者tuple的情况下,加一个*
可以让其变为可变参数传入函数。
关键字参数
关键字参数和可变参数很像,它允许传入任意数量的参数,然后将其组装为一个dict。
def person(name, age, **kw):
print('name:', name, 'age:', age, 'other:', kw)
return None
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)
命名关键字参数
这个相比关键字参数限制了传入关键字,比如:
def person(name, age, *, city, job):
print(name, age, city, job)
只接受city
和job
作为关键字,格式是需要一个*
作为分隔,其后的参数将被视作命名关键字参数。
或者可以**def** **person**(name, age, *args, city, job):
这样就不需要分隔符,否则都会认为是位置参数。
注意: