1 Python语言概述
1.1 走进Python
1.1.1 Python简史
一种解释型的、面向对象的、带有动态语义的高级程序设计语言。
使用Python作为语言的名字,因为Guido是英国幽默剧团
Monty Python飞行马戏团的fans。
1.1.2 特征
-
简单易学
- Python是一种代表简单主义思想的语言。Python的这种伪代码本质是它最大的优点之一。它使得编程者可以专注于问题而不是语言本身。Python具有极其简单的语法,极易上手。
-
解释性&编译性
- Python语言写的程序不需要编译成二进制代码。可以直接从源代码运行程序,但是需要解释器。使得Python程序更加易于移植。
-
可扩展、可嵌入
-
面向对象
- 与其他主要的语言如C++和java相比,Python以一种非常强大又简单的方式实现面向对象编程。
-
高级语言
- 使用Python语言写的程序,无需考虑诸如管理内存一类的底层。
-
丰富的库
-
Python、标准库确实很庞大。它可以帮助你处理各种工
作,包括正则表达式、 文档生成、单元测试、线程、
数据库、网页浏览器、CGI、FTP、电子邮件、XML、
XML-RPC、HTML、WAV文件、密码系统、GUI(图
形用户 界面)、Tk和其他与系统有关的操作。
-
1.2 搭建Python环境
官网:Welcome to Python.org
1.2.1 Python版本对比及安装
Python 2和Python 3的版本之间差别:
- Python 2和Python 3分别是Python的两个版本,按照Python官方的计划,Python 2只支持到2020年。为了不带入过多的累赘,Python3 在设计的时候没有考虑向下相容,许多针对早期Python版本设计的程序都无法在Python 3上正常执行。
- Python 2最新版本(Python 2.7.18),python 2在目前的企业开发中使用较为广泛成熟,python 3更人性化更简单;部分库存在差异,比如python 2中urilib、urilib2两个库合并为3中urilib库
1.2.2 Python的两种编程方式
- 交互式:对每个输入语句即时运行结果,适合语法练习,比如再开始菜单栏Python中的IDLE,是一个Python shell(交互式Python解释器)。过键入文本与程序交互的途径
- 文件式:批量执行一组语句并运行结果,编程的主要方式
1.2.3 Python常用工具
- Anaconda主要用于数据分析,附带了一大批常用数据科学包,它包含了一个包管理工具和一个Python管理环境。
- pycharm python是一款强大的python IDE。它拥有调试、语法高亮、Project管理、代码跳转、智能提示等功能,功能相当的齐全。
- Sublime3是轻量级的编辑器工具。代码高亮、语法提示、华丽的界面,还支持插件扩展。
- VSCode 微软出品,与Visual studio同质量的专业级开发工具
- PyDevEclipse for Python
小结
- Python安装、交互式解释器
- 表达式:计算机程序的组成部分,用于表示值。
- 变量:一个名字,它表示某个值
- 语句:告诉计算机做某些事情的指令
- 函数:实现某些功能的代码段。
- 模块:是一些对Python功能的扩展。可以被导入到python中。
2 Python数据类型
详细看课件
2.1 数字类型
2.1.1 整型(int)
功能:用于表示整数,Python 3 里仅有一种整数类型 int,能存储几乎任意大小的整数,可通过 type () 函数查询变量类型。
# 定义整型变量num并赋值为123
num = 123
# 调用type()函数查询num的类型,输出结果为<class 'int'>,确认其为整型
print(type(num)) # <class 'int'>
2.1.2 浮点型(float)
功能:表示带有小数点的数值,同样可借助 type () 函数明确其类型。
# 定义浮点型变量pi并赋值为3.14
pi = 3.14
# 调用type()函数查询pi的类型,输出结果为<class 'float'>,表明其是浮点型
print(type(pi)) # <class 'float'>
2.1.3 布尔型(bool)
功能:仅包含 True 和 False 两个值,分别代表真和假,在数值运算场景中,True 等效于 1,False 等效于 0。
# 定义布尔型变量is_ok并赋值为True
is_ok = True
# 打印is_ok的值,输出True
print(is_ok) # True
# 进行数值运算,True按1计算,结果为2
print(is_ok + 1) # 2
2.1.4 复数型(complex)
功能:用于表示复数,形式为 a+bj(a、b 为实数),可通过 real 属性获取实部,imag 属性获取虚部。
# 定义复数型变量z,实部为1.5,虚部为0.5
z = 1.5 + 0.5j
# 访问z的real属性,获取并打印实部,输出1.5
print(z.real) # 1.5 (实部)
# 访问z的imag属性,获取并打印虚部,输出0.5
print(z.imag) # 0.5 (虚部)
2.2 字符串
创建一个字符串可以直接创建,也可以用str()这样的工厂函数(实际是类)创建。
字符串是不可变的,这意味着一旦创造了一个字符串,就不能再改变它了
转义符
- 假设想要在一个字符串中包含一个单引号(),例如这个字符串是What's your name?。
- 肯定不能用'What's your name?来指示它,因为Python会弄不明白这个字符串从何处开始,何处结束所以,需要指明单引号而不是字符串的结尾。可以通过 转义符 来完成这个任务。用'来指示单引号 --注意这个反斜杠。现在可以把字符串表示为'What
\
's your name?'. - 另一个表示这个特别的字符串的方法是“What's your name?",即用双号。类似地,要在双引号字符串中使用双引号本身的时候,也可以借助于转义符。另外,可以用转义符
\\
来指示反斜杠本身。
功能:用于存储文本数据,字符串是不可变的,支持索引、切片、拼接和重复等操作。
# 定义字符串s并赋值为"Hello"
s = "Hello"
# 通过索引0获取字符串第一个字符,输出'H'
print(s[0]) # 'H'
# 通过负索引-1获取字符串最后一个字符,输出'o'
print(s[-1]) # 'o'
# 对字符串进行切片,获取索引1到3(不包含4)的字符,输出'ell'
print(s[1:4]) # 'ell'
# 拼接两个字符串,输出'Hello World'
print(s + " World") # 'Hello World'
# 重复字符串3次,输出'HelloHelloHello'
print(s * 3) # 'HelloHelloHello'
格式化操作符%
%r
功能:优先用repr()
函数进行字符串转换,会保留对象的原始表示(包括引号等)。
text = "hello"
print("Using %r: %r" % (text, text)) # Using %r: 'hello'
%s
功能:优先用str()
函数进行字符串转换,是更常规的字符串显示。
text = "hello"
print("Using %s: %s" % (text, text)) # Using %s: hello
%d / %i
功能:转换成有符号十进制数。
num = -10
print("Decimal (d): %d, Decimal (i): %i" % (num, num)) # Decimal (d): -10, Decimal (i): -10
%u
功能:转换成无符号十进制数(注意:Python3中%u
基本等同于%d
,因为Python3整型无符号有符号统一)。
num = 10
print("Unsigned decimal: %u" % num) # Unsigned decimal: 10
%o
功能:转换成无符号八进制数。
num = 8
print("Octal: %o" % num) # Octal: 10
%x / %X
功能:转换成无符号十六进制数(x
小写,X
大写)。
num = 16
print("Hex (lower): %x, Hex (upper): %X" % (num, num)) # Hex (lower): 10, Hex (upper): 10
%e / %E
功能:转换成科学计数法(e
小写,E
大写)。
num = 1000
print("Scientific (e): %e, Scientific (E): %E" % (num, num))
# Scientific (e): 1.000000e+03, Scientific (E): 1.000000E+03
%f / %F
功能:转换成浮点数。
num = 3.14159
print("Float (f): %f, Float (F): %F" % (num, num)) # Float (f): 3.141590, Float (F): 3.141590
%%
功能:输出%
。
print("Percent sign: %%") # Percent sign: %
2.3 列表类型
功能:是有序且可变的元素集合,元素类型可以不同,支持添加、修改、删除元素等操作。
# 定义列表my_list,包含整型、字符串型和浮点型元素
my_list = [1, "apple", 3.14]
# 使用append()方法在列表末尾添加"banana",列表变为[1, "apple", 3.14, "banana"]
my_list.append("banana")
# 通过索引1修改列表元素,将"apple"改为"orange",列表变为[1, "orange", 3.14, "banana"]
my_list[1] = "orange"
# 使用remove()方法删除列表中的元素1,列表变为["orange", 3.14, "banana"]
my_list.remove(1)
创建列表
-
直接赋值:用方括号
[]
a = [1, 2, 3] b = [] # 空列表
-
list() 工厂函数:从其他可迭代对象创建
list(range(1, 5)) # [1, 2, 3, 4] list('abc') # ['a', 'b', 'c']
访问 & 修改元素
-
索引访问:从 0 开始
a = [3, 4, 5] a[1] # 4 a[1] = 6 # 修改 -> [3, 6, 5]
增加元素
-
append(x):尾部追加,原地修改
a = [3, 4]; a.append(5) # [3, 4, 5]
-
extend(iterable):扩展列表
a = [1, 2]; a.extend([3, 4]) # [1, 2, 3, 4]
-
insert(index, x):在指定位置插入
a = [1, 3]; a.insert(1, 2) # [1, 2, 3]
-
乘法扩展:重复元素
[1, 2] * 3 # [1, 2, 1, 2, 1, 2]
删除元素
-
del:按索引删除或整个列表
a = [3, 5, 7]; del a[1] # [3, 7]
-
pop([index]):删除并返回元素
a = [3, 5, 7]; a.pop() # 返回 7, a -> [3, 5]
-
remove(x):删除第一个匹配值
a = [3, 5, 3]; a.remove(3) # [5, 3]
-
clear():清空列表
a.clear() # []
查询
-
len(list):元素个数
len([3, 5, 7]) # 3
-
index(x):首个匹配值索引
[3, 5, 7].index(5) # 1
-
count(x):统计元素出现次数
[3, 3, 5].count(3) # 2
-
in / not in:判断成员资格
3 in [1, 3, 5] # True
其他操作
-
reverse():原地逆序
a = [3, 5, 7]; a.reverse() # [7, 5, 3]
-
sort():原地排序
a = [3, 1, 2]; a.sort() # [1, 2, 3]
-
copy():浅拷贝
b = a.copy() # 新列表,id不同
切片操作
-
创建新列表
a = [1, 2, 3, 4, 5] a[1:4] # [2, 3, 4] a[::-1] # [5, 4, 3, 2, 1] # 倒序
-
通过切片修改/插入
a[1:3] = [20, 30] # 替换 a[len(a):] = [6] # 尾部插入
-
通过切片删除
del a[1:3] # 删除索引1-2的元素
2.4 列表方法
list.append(x)
功能:将元素x
添加到列表末尾。
my_list = [1, 2, 3]
my_list.append(4)
print(my_list) # [1, 2, 3, 4]
list.extend(L)
功能:把列表L
里的所有元素添加到原列表尾部。
my_list = [1, 2, 3]
other_list = [4, 5]
my_list.extend(other_list)
print(my_list) # [1, 2, 3, 4, 5]
list.insert(index, x)
功能:在列表指定位置index
处插入元素x
。
my_list = [1, 2, 3]
my_list.insert(1, 10)
print(my_list) # [1, 10, 2, 3]
list.remove(x)
功能:删除列表中首次出现的指定元素x
。
my_list = [1, 2, 3, 2]
my_list.remove(2)
print(my_list) # [1, 3, 2]
list.pop([index])
功能:删除并返回列表指定位置index
的元素,若不指定index
,默认删除最后一个元素。
my_list = [1, 2, 3]
popped = my_list.pop(1)
print(popped) # 2
print(my_list) # [1, 3]my_list = [1, 2, 3]
popped_last = my_list.pop()
print(popped_last) # 3
print(my_list) # [1, 2]
list.clear()
功能:删除列表里的所有元素,但保留列表对象。
my_list = [1, 2, 3]
my_list.clear()
print(my_list) # []
list.index(x)
功能:返回值为x
的首个元素的下标。
my_list = [1, 2, 3, 2]
index = my_list.index(2)
print(index) # 1
list.count(x)
功能:返回指定元素x
在列表中的出现次数。
my_list = [1, 2, 3, 2]
count = my_list.count(2)
print(count) # 2
list.reverse()
功能:对列表元素进行原地倒序。
my_list = [1, 2, 3]
my_list.reverse()
print(my_list) # [3, 2, 1]
list.sort()
功能:对列表元素进行原地排序,默认升序,也可指定降序。
my_list = [3, 1, 2]
my_list.sort()
print(my_list) # [1, 2, 3]my_list = [3, 1, 2]
my_list.sort(reverse=True)
print(my_list) # [3, 2, 1]
list.copy()
功能:返回列表对象的浅拷贝,会新建列表,改变原列表id。
my_list = [1, 2, 3]
new_list = my_list.copy()
print(new_list) # [1, 2, 3]
2.5 元组类型
- Python的元组与列表类似,不同之处在于元组的元素不能修改 更新、删除。
- 元组使用小括号,列表使用方括号。
- 元组创建很简单,只需要在括号中添加元素,并使用逗号隔开即可。
- 元组中的可变对象依然可变
- 若元组中有列表等可变对象,那么修改元组中的该可变对象是可以的,即元组的id不变。
功能:是有序但不可变的元素集合,元素类型可不同,定义后无法修改元素值。
# 定义元组my_tuple,包含整型、字符串型和浮点型元素
my_tuple = (1, "apple", 3.14)
# 通过索引1获取元组中的元素"apple",输出'apple'
print(my_tuple[1]) # 'apple'
# 尝试修改元组元素,会报错,因为元组不可变
# my_tuple[1] = "orange" # 错误!元组不可变
元组与列表的区别
- 元组中的数据一旦定义就不允许更改。
- 元组没有append()、extend()和insert()等方法,无法向元组中添加元素;
- 元组没有remove()或pop()方法,也无法对元组元素进行del操作,不能从元组中删除元素。
- 内置的tuple()函数接受一个列表参数,并返回一个包含同样元素的元组,而list()函数接受一个元组参数并返回一个列表。从效果上看,tuple(.)冻结列表,而list(.)融化元组。
元组的优点
- 元组的速度比列表更快。如果定义了一系列常量值,而所需做的仅是对它进行遍历,那么一般使用元组而不用列表。
- 元组对不需要改变的数据进行“写保护”将使得代码更加安全。
2.6 字典类型
功能:以键值对的形式存储数据,键具有唯一性且必须是不可变类型,支持添加、修改键值对以及获取值等操作。
# 定义字典person,包含"name"和"age"两个键值对
person = {"name": "Alice", "age": 30}
# 通过键"name"获取对应的值,输出'Alice'
print(person["name"]) # 'Alice'
# 添加新的键值对"city": "Beijing"到字典中
person["city"] = "Beijing"
# 修改键"age"对应的值,将30改为31
person["age"] = 31
# 使用get()方法获取键"email"对应的值,若键不存在则返回默认值"N/A",输出'N/A'
print(person.get("email", "N/A")) # 'N/A' (键不存在时返回默认值)
2.7 集合
功能:是无序且元素不重复的集合,支持并集、交集、差集等数学运算,也可添加元素。
# 定义集合s1,包含元素1、2、3
s1 = {1, 2, 3}
# 定义集合s2,包含元素3、4、5
s2 = {3, 4, 5}
# 计算s1和s2的并集,输出{1, 2, 3, 4, 5}
print(s1 | s2) # {1, 2, 3, 4, 5} 并集
# 计算s1和s2的交集,输出{3}
print(s1 & s2) # {3} 交集
# 计算s1相对于s2的差集,输出{1, 2}
print(s1 - s2) # {1, 2} 差集
# 向s1中添加元素6,s1变为{1, 2, 3, 6}
s1.add(6) # {1, 2, 3, 6}
2.8 集合方法
s.issubset(t)
功能:判断集合s
是否为集合t
的子集,若是返回True
,否则返回False
。
s = {1, 2}
t = {1, 2, 3}
print(s.issubset(t)) # True
s.issuperset(t)
功能:判断集合t
是否为集合s
的超集,若是返回True
,否则返回False
。
s = {1, 2, 3}
t = {1, 2}
print(s.issuperset(t)) # True
s.union(t)
功能:返回一个新集合,是集合s
和集合t
的并集。
s = {1, 2}
t = {3, 4}
union_set = s.union(t)
print(union_set) # {1, 2, 3, 4}
s.intersection(t)
功能:返回一个新集合,是集合s
和集合t
的交集。
s = {1, 2, 3}
t = {2, 3, 4}
intersection_set = s.intersection(t)
print(intersection_set) # {2, 3}
s.difference(t)
功能:返回一个新集合,包含属于s
但不属于t
的元素。
s = {1, 2, 3}
t = {2, 3, 4}
diff_set = s.difference(t)
print(diff_set) # {1}
s.symmetric_difference(t)
功能:返回一个新集合,包含属于s
或t
但不同时属于两者的元素。
s = {1, 2, 3}
t = {2, 3, 4}
sym_diff_set = s.symmetric_difference(t)
print(sym_diff_set) # {1, 4}
s.copy()
功能:返回一个新集合,是集合s
的浅复制。
s = {1, 2, 3}
copy_set = s.copy()
print(copy_set) # {1, 2, 3}
2.9 常用操作和函数
2.9.1 成员资格判断
功能:判断某个元素是否在指定的序列(如列表)中,使用 in 和 not in 关键字。
# 定义列表my_list,包含元素1、2、3
my_list = [1, 2, 3]
# 判断2是否在my_list中,结果为True
print(2 in my_list) # True
# 判断4是否不在my_list中,结果为True
print(4 not in my_list) # True
2.9.2 内置函数
功能:len () 用于获取序列长度,sum () 用于计算序列中元素的和,max () 用于获取序列中的最大值,min () 用于获取序列中的最小值。
# 定义列表nums,包含元素89、78、92
nums = [89, 78, 92]
# 调用len()函数获取nums的长度,输出3
print(len(nums)) # 3
# 调用sum()函数计算nums中元素的和,输出259
print(sum(nums)) # 259
# 调用max()函数获取nums中的最大值,输出92
print(max(nums)) # 92
# 调用min()函数获取nums中的最小值,输出78
print(min(nums)) # 78
3 Python流程控制
3.1 流程控制基础
3.1.1 顺序执行
f = int(input("温度°F:"))
c = (f-32) * 5.0 / 9
print("温度°C:", c)
3.1.2 条件判断
单分支
if c > 35:print("Heat Wave!")
双分支
if c >= 35:print("Heat Wave!")
else:print("Cold Wave!")
多分支
if c >= 35:print("Heat Wave!")
elif c <= -6:print("Cold Wave!")
else:print("Have fun!")
三元运算符
bigger = x if x > y else y
3.1.3 布尔表达式
# 关系运算符
<, <=, ==, >, !=, is, is not, in, not in# 逻辑运算符
and, or, not
3.2 循环
3.2.1 for 循环
for i in range(5): # 0,1,2,3,4print(i)
遍历容器
for k, v in {'Jan':1,'Feb':2}.items():print(k, v)
嵌套循环:九九乘法表
for i in range(1,10):for j in range(1,i+1):print(f"{j}*{i}={i*j}", end=" ")print()
3.2.2 while 循环
count = 0
while count < 3:print(count)count += 1
else:print("循环结束")
哨兵循环
x = int(input("输入数字(-1结束):"))
while x >= 0:sum += xx = int(input("输入数字(-1结束):"))
无限循环
while True:x = input("输入内容:")if x == "exit":break
3.2.3 循环控制语句
break # 立即跳出循环
continue # 跳过本次循环
pass # 占位什么也不做
3.3 函数
3.3.1 定义 & 调用
def hello():print("Hello!")hello()
3.3.2 参数类型
# 必需参数
def f(a): print(a)
f(1)# 关键字参数
def f(name, age): print(name, age)
f(age=20, name="Tom")# 默认参数
def f(name, age=30): print(name, age)
f("Tom") # age=30# 可变参数
def calc(*nums):return sum(n*n for n in nums)# 不定长参数
def f(a, *b):print(a, b)
3.3.3 返回值
def sub(x, y):return x - y
result = sub(10, 3)
3.3.4 作用域
x = 10 # 全局变量
def f():global xx += 1print(x)
3.3.5 递归
def fac(n):return 1 if n <= 1 else n * fac(n-1)def fib(n):return 1 if n <= 2 else fib(n-1) + fib(n-2)
3.4 模块
3.4.1 创建模块 (function.py)
def add(a,b): return a+b
def sub(a,b): return a-b
3.4.2 导入模块
import function
print(function.add(1,2))from function import add
print(add(1,2))from function import * # 不推荐
3.5 内置函数与I/O
# 常用内置函数
int(), float(), str(), len(), max(), min(), sum(), round(), range()# 输入输出
name = input("请输入名字:")
print(f"你好,{name}")