版本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() 函数可以用来查询变量所指的对象类型。
    1. >>> a, b, c, d = 20, 5.5, True, 4+3j
    2. >>> print(type(a), type(b), type(c), type(d))
    3. <class 'int'> <class 'float'> <class 'bool'> <class 'complex'>
    对于int类型,默认十进制,其他进制需要加前导符
二进制 0b或0B
八进制 0o或oO
十六进制 0x或0X

注意:Python3 中,bool 是 int 的子类,True 和 False 可以和数字相加, True==1、False==0 会返回 True;在 Python2 中是没有布尔型的,它用数字 0 表示 False,用 1 表示 True。

数值运算

  1. >>> 5 + 4 # 加法
  2. 9
  3. >>> 4.3 - 2 # 减法
  4. 2.3
  5. >>> 3 * 7 # 乘法
  6. 21
  7. >>> 2 / 4 # 除法,得到一个浮点数
  8. 0.5
  9. >>> 5 // 3 # 除法,得到一个整数
  10. 1
  11. >>> 17 % 3 # 取余
  12. 2
  13. >>> 2 ** 5 # 乘方
  14. 32

注意:

  • Python可以同时为多个变量赋值,如a, b = 1, 2。
  • 一个变量可以通过赋值指向不同类型的对象。
  • 数值的除法包含两个运算符:/ 返回一个浮点数,// 返回一个整数。
  • 在混合计算时,Python会把整型转换成为浮点数。

复数:a + bj 或者complex(a,b)表示,a,b均为浮点类型

字符串

  • 字符串用'"括起来。
  • \转义特殊字符,在字符串前添加r表示不转义,如print(r'Kenshin\n')输出Kenshin\n
  • 字符串截取格式变量[头下标:尾下标]

Python学习 - 图1

  • +是字符串的连接符,*表示复制当前字符串,如print(2*str)

注意:

  • Python 没有单独的字符类型,一个字符就是长度为1的字符串。
  • 与 C 字符串不同的是,Python 字符串不能被改变。向一个索引位置赋值,比如word[0] = ‘m’会导致错误。

List | 列表

Click to Know More

  • 列表是写在方括号 [] 之间、用逗号分隔开的元素列表,如list = ['abcd', 123, True, 70.4]
  • 列表截取格式和字符串一样,变量[头下标:尾下标]
  • 索引值以 0 为开始值,-1 为从末尾的开始位置。

Python学习 - 图2

  • +是列表连接运算符,*是重复操作。
  • 与字符串不同的是,列表的元素可以改变。

    1. >>> a = [1, 2, 'Kenshin', 3.6]
    2. >>> a[0] = 3
    3. >>> a[1:] = [4, 'Oneko', 7.7]
    4. >>> a
    5. [3, 4, 'Oneko', 7.7]
  • (New)列表可以接受第三个参数,作用是设置截取步长,缺省时默认步长为1;如果步长为负数,表示逆向读取,可用于翻转字符串。

Python学习 - 图3

Tuple | 元组

Click to Know More

  • 元组与列表类似,但元素不能修改。元组写在()内。
  • 索引和切片操作和列表相同。
  • 元组可以包含可变的对象,如list列表。
  • 包含0个或1个元素的元组写法较为特殊。
    1. tuple1 = () #空元组
    2. tuple2 = (3, ) #一个元素的元组
    String,List 和 Tuple 都属于 Sequence(序列)。

Set | 集合

Click to Know More

  • 集合是由一个或数个形态各异的大小整体组成的,构成集合的事物或对象称作元素或是成员
  • {}或者set()函数创建集合,空集合必须用set(),不能用{ }{ } 用来创建空字典。

    1. >>> x = set('eleven')
    2. >>> y = set('twelve')
    3. >>> x, y
    4. ({'l', 'e', 'n', 'v'}, {'e', 'v', 'l', 't', 'w'})
    5. >>> x & y #交集
    6. {'l', 'e', 'v'}
    7. >>> x | y #并集
    8. {'e', 'v', 'n', 'l', 't', 'w'}
    9. >>> x - y #差集
    10. {'n'}
    11. >>> x ^ y #补集
    12. {'t', 'n', 'w'}

    添加和删除元素

    1. S = set([1, 2, 2, 3, 4])
    2. S.add(5) #添加元素
    3. S.remove(4) #删除元素

    Dictionary | 字典

    Click to Know More

  • 字典是无序的对象集合。

  • 字典用{ }标识,储存结构为key:value,如dict = {key1:value1, key2:value2}
  • 键一般唯一,若不唯一,最后一个键值会替换前面的键值。
  • 键必须取不可变类型,值可以任意数据类型。

访问字典的值

  1. dict = {'Name': 'Zara', 'Age': 7, 'Class': 'First'}
  2. print "dict['Name']: ", dict['Name']
  3. print "dict['Age']: ", dict['Age']
  4. '''
  5. 输出
  6. dict['Name']: Zara
  7. dict['Age']: 7
  8. '''

判断key是否存在

  1. >>> dict = {'Name': 'Zara', 'Age': 7, 'Class': 'First'}
  2. >>> 'Kenshin' in dict #通过in函数判断
  3. >>> False
  4. >>> dict.get('Name') #通过get函数判断,如果没有key,返回None,如果有,返回对应value
  5. >>> 'Zara'

修改键值&添加和删除键值对

  1. dict = {'Kenshin':45, 'oneko':18}
  2. dict['Kenshin'] = 10 #修改值
  3. dict['czl'] = 19 #添加方法1
  4. tmp = {'憨憨':'czl'}
  5. dict.update(tmp) #添加方法2
  6. del[dict['Kenshin']] #删除方法1
  7. dict.pop('oneko') #删除方法2,pop返回值是删除的键的值
  8. dict.clear() #删除所有键对

set和dict的唯一区别仅在于没有存储对应的value。

数据类型转换

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 条件分支

  1. if <条件判断1>:
  2. <执行1>
  3. elif <条件判断2>:
  4. <执行2>
  5. elif <条件判断3>:
  6. <执行3>
  7. else:
  8. <执行4>

1.3.2 循环结构

  1. for x in range(100):
  2. #do somthing
  3. while n > 0:
  4. #do something

breakcontinue的用法和C语言一致。

1.4 基本输入/输出

str()

  • 输出一个字符串,如'Kenshin'

    repr()

  • 输出一个解释器可读的字符串"'Kenshin'"

  • 可以转义字符串中的特殊字符,s = 'Kenshin\n'``repr(s)输出'Kenshin\n'
  • 参数可以是Python中的任何对象。

    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: KenshinKenshin也可用变量代替。
  • format()print('Hello, {0}, 作业还有{1:.2f}%'.format('Kenshin', 99.667))输出
  • f-stringprint(f'{name}, 作业还有{percent:.2f}%')namepercent可被替换。

    input

  • 从stdin读入字符串。

  • 可以打印提示字符串,如input("请输入:")输出请输入:

1.5 函数

1.5.1 定义函数

定义一个函数要使用def语句,依次写出函数名、括号、括号中的参数和冒号:,然后,在缩进块中编写函数体,函数的返回值用return语句返回。

  1. def myAdd(a, b):
  2. c = a + b
  3. return c

Python中有pass语句做占位符,可以使空函数运行起来,不加pass会报错。

  1. def nop():
  2. pass

返回多个值

  1. import math
  2. def move(x, y, step, angle=0):
  3. nx = x + step * math.cos(angle)
  4. ny = y - step * math.sin(angle)
  5. return nx, ny
  6. x, y = move(100, 100, 60, math.pi / 6)
  7. print(x, y) #输出151.96152422706632 70.0
  8. r = = move(100, 100, 60, math.pi / 6)
  9. print(r) #输出(151.96152422706632, 70.0)

实际上函数返回还是一个值,但是返回的是一个Tuple,如果用多个变量接受时,可以按顺序赋给对应的值。

1.5.2 参数

默认参数

  1. def myPow(x, n = 1):
  2. ans = 1
  3. while n > 0:
  4. n = n - 1
  5. s = s * x
  6. return s
  7. myPow(2) #即为myPow(2,1)
  8. myPow(2,5)

注意:默认参数必须在必选参数的后面。
默认参数的意义在于降低函数调用难度,尤其体现在某个参数大多一样时,可以不用传参,有不一样时,再传参。
有多个默认参数时,可以按顺序提供部分默认参数,如果不按顺序时,需要提供参数名,如default_parameter_i = value
看一个例子

  1. def add_end(L = []):
  2. L.append('end')
  3. return L
  4. add_end([1,2,3]) #输出[1,2,3,'end']
  5. add_end() #输出['end']
  6. add_end() #输出['end','end']

注意6,7两行,由于默认参数是可变对象,所以,每次传默认参数调用后,默认参数就改变了。这个例子中,将[]改为None即可。
默认参数必须指向不可变对象!

可变参数

Python可以在参数前加一个*,在函数内部,参数组装为一个tuple。如:

  1. def calc(*numbers):
  2. sum = 0
  3. for n in numbers:
  4. sum = sum + n * n
  5. return sum
  6. calc(1, 2, 3) #输出14
  7. calc() #输出0
  8. items = [1, 3, 4, 5]
  9. calc(*items) #输出51

10,11行说明了在已有一个list或者tuple的情况下,加一个*可以让其变为可变参数传入函数。

关键字参数

关键字参数和可变参数很像,它允许传入任意数量的参数,然后将其组装为一个dict

  1. def person(name, age, **kw):
  2. print('name:', name, 'age:', age, 'other:', kw)
  3. return None
  4. person('Michael', 30) #输出name: Michael age: 30 other: {}
  5. person('Bob', 35, city='Beijing') #输出name: Bob age: 35 other: {'city': 'Beijing'}
  6. person('Adam', 45, gender='M', job='Engineer')
  7. #输出name: Adam age: 45 other: {'gender': 'M', 'job': 'Engineer'}
  8. extra = {'city': 'Beijing', 'job': 'Engineer'}
  9. person('Jack', 24, **extra)

命名关键字参数

这个相比关键字参数限制了传入关键字,比如:

  1. def person(name, age, *, city, job):
  2. print(name, age, city, job)

只接受cityjob作为关键字,格式是需要一个*作为分隔,其后的参数将被视作命名关键字参数。
或者可以**def** **person**(name, age, *args, city, job):这样就不需要分隔符,否则都会认为是位置参数。
注意:

  • 命名关键字参数必须传入参数名,否则会把它当做可变参数。
  • 可以缺省,设置默认值。

    参数组合

    Python的参数十分灵活,不过严格按照必选参数默认参数可变参数关键字参数命名关键字参数的顺序,可以任意组合。