| |
|
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
| -> Python知识库 -> Python 3 快速入门 —— 流程控制与函数 -> 正文阅读 |
|
|
[Python知识库]Python 3 快速入门 —— 流程控制与函数 |
|
本文假设你已经有一门面向对象编程语言基础,如? 编程前菜>>> a, b = 0, 1 ... while a < 10: ... print(a, end=', ') ... a, b = b, a+b # 多重赋值,右表达式在赋值前就已经求值了 ... 0, 1, 1, 2, 3, 5, 8, # Fibonacci series 如上为典型的? >>> a = [1, 2, 3]
... b = [1, 2, 3]
... print('a = b:', a == b)
a = b: True # a, b 中元素的 个数相同 且 值依次相等
>>> a is b
False # a, b 没指向同一个对象
>>> c = a
>>> c is a # a, c 指向同一个对象
True
>>> id(c)
2827535985280
>>> id(a)
2827535985280 # c, a 所指对象id相同,故指向同一对象
流程控制if 语句
>>> x = int(input("input a digit: "))
... if a < 0:
... print("Negative")
... elif a == 0:
... print("Zero")
... else:
... print("Positive")
...
input a digit: >? 10
Positive
for 和 while 语句
>>> digits = [1, 2, 3] ... for x in digits: # 遍历list ... print(x, end=", ") ... 1, 2, 3, >>> s = "python" ... for ch in s: # 遍历字符串 ... print(ch, end=" ") ... p y t h o n 由于? # while中根据下标遍历list >>> digits = [1, 2, 3] >>> i = 0 ... while i < len(digits): ... print(digits[i], end=" ") ... i = i + 1 ... 1 2 3 # while中根据下标修改list >>> digits = [1, 2, 3] >>> i = 0 ... while i < len(digits): ... if digits[i] == 2: ... digits[i] = 8 ... i = i + 1 ... >>> print(digits) [1, 8, 3] 其次,我们还可以利用?range()?函数和?enumerate()?函数: # 使用range,以0为起点,len为终点(不包含),以1为步长创建下标序列 >>> digits = [1, 2, 3] ... for i in range(len(digits)): ... print(digits[i], end=" ") ... 1 2 3 >>> digits = [1, 2, 3] ... for i in range(len(digits)): ... if digits[i] == 2: ... digits[i] = 8 ... print(digits) [1, 8, 3] # 使用enumerate,创建枚举序列,可以同时取出位置索引和对应的值 >>> digits = [1, 2, 3] ... for i, v in enumerate(digits): ... print(i, v) ... 0 1 1 2 2 3 >>> digits = [1, 2, 3] ... for i, v in enumerate(digits): ... if v == 2: ... digits[i] = 8 ... print(digits) [1, 8, 3] 我们还可以使用? # 遍历字典对象的key
>>> cities = {"chengdu": "A", "mianyang": "B", "guangyuan": "H"}
... for k in cities:
... print(k, end=" ")
...
chengdu mianyang guangyuan
# 遍历字典对象时同时根据key遍历value
>>> cities = {"chengdu": "A", "mianyang": "B", "guangyuan": "H"}
... for k in cities:
... print(k, cities[k], sep=": ")
...
chengdu: A
mianyang: B
guangyuan: H
# 调用字典对象的items方法后可同时遍历key和value
>>> cities = {"chengdu": "A", "mianyang": "B", "guangyuan": "H"}
... for k, v in cities.items():
... print(k, v, sep=": ")
...
chengdu: A
mianyang: B
guangyuan: H
注意:上诉for语句中申明变量在循环结束后依然存在,而列表、元组等推导表达式中则不会: >>> for x in [1, 2, 3]: ... print(x) ... 1 2 3 >>> print(x) 3 由于一般不推荐在遍历数据集合时直接修改原数据集合来获取我们想要的数据集合,这样不安全且不够灵活。推荐在遍历原数据集合时根据条件创建一个新的数据集合,而这正是? 列表推导式列表推导式创建列表,列表推导式的方括号内包括:?一个表达式,后面为一个? # 创建 0 - 9 的平方列表 >>> [v**2 for v in range(10)] [0, 1, 4, 9, 16, 25, 36, 49, 64, 81] # 验证列表推导式执行后for子句中的变量是否还存在 >>> [v**2 for v in range(10)] ... print(v) Traceback (most recent call last): File "<input>", line 2, in <module> NameError: name 'v' is not defined # 将两个列表中不相等的元素组合起来 >>> [(x, y) for x in [1, 2, 3] for y in [1, 2, 3] if x != y] [(1, 2), (1, 3), (2, 1), (2, 3), (3, 1), (3, 2)] # 等价于 >>> res = [] ... for x in [1, 2, 3]: ... for y in [1, 2, 3]: ... if x != y: ... res.append((x, y)) ... print(res) [(1, 2), (1, 3), (2, 1), (2, 3), (3, 1), (3, 2)] 列表推导式的第一个表达式不但可以为复杂的表达式、函数,甚至可以为?另一个列表推导式?: >>> matrix = [ ... [1, 2, 3], ... [4, 5, 6], ... [7, 8, 9] ... ] ... # 创建matrix的转置 >>> [[row[i] for row in matrix] for i in range(3)] [[1, 4, 7], [2, 5, 8], [3, 6, 9]] # 等价于 >>> res = [] ... for i in range(3): ... res.append([row[i] for row in matrix]) ... print(res) [[1, 4, 7], [2, 5, 8], [3, 6, 9]] # 又等价于 >>> res = [] ... for i in range(3): ... temp = [] ... for row in matrix: ... temp.append(row[i]) ... res.append(temp) ... print(res) [[1, 4, 7], [2, 5, 8], [3, 6, 9]] 与列表类似,集合、字典也都支持推导式(元组不支持): # 集合推导式
>>> { x**2 for x in [1, 2, 1, 4]}
{16, 1, 4}
# 字典推导式
>>> { x: x**2 for x in [1, 2, 1, 4]}
{1: 1, 2: 4, 4: 16}
循环中的break、continue 与 else 语句
# 可迭代对象中的元素全部循环完毕时执行else子句
>>> for x in []:
... print(x, end=" ")
... else:
... print("end")
...
end
>>> for x in range(3):
... print(x, end=" ")
... else:
... print("end")
...
0 1 2 end
# 使用break语句终止循环则不执行else子句
>>> for x in range(3):
... print(x, end=" ")
... if x == 2:
... break
... else:
... print("end")
...
0 1 2
# continue不影响else子句的
>>> for x in range(3):
... print(x, end=" ")
... if x == 2:
... continue
... else:
... print("end")
...
0 1 2 end
# while条件为假时执行else子句
>>> x = 10
... while x < 10:
... print(x)
... else:
... print("not in while")
...
not in while
match语句(3.10开始支持)
>>> status = 404
... match status:
... case 404: # 默认只匹配一个分支,不需要也不能加入其他语言中的break语句
... print("Not Found!")
... case 500:
... print("Internal Error!")
... case _: # _ 类似于其他语言中的default
... print("Not Known!")
...
Not Found!
当我们希望多个? case 401 | 402 | 403:
print("Not Allowed!")
>>> point = (1, 2)
... match point:
... case (0, 0):
... print("Origin")
... case (0, y):
... print("on Y axis, y =", y)
... case (x, 0):
... print("on X axis, x =", x)
... case (x, y):
... print("x =", x, "y =", y)
... case _:
... print("Not Valid!")
...
x = 1 y = 2
更多功能需要时查询文档即可:?match?语句?。
函数想必大家对函数都有所了解,相比其他语言,? >>> def printFib(n):
... """打印 Fibonacci 数列
...
... :param n: 小于n
... :return: None
... """
... a, b = 0, 1
...
... while a < n:
... print(a, end=" ")
... a, b = b, a + b
...
>>> printFib(10)
0 1 1 2 3 5 8
>>> print(printFib(10))
0 1 1 2 3 5 8
None # 默认返回值
# 通过help函数或函数的__doc__变量可以查看文档内容
>>> help(printFib)
Help on function printFib in module __main__:
printFib(n)
打印 Fibonacci 数列
:param n: 小于n
:return: None
>>> print(printFib.__doc__)
打印 Fibonacci 数列
:param n: 小于n
:return: None
上诉代码块中? 参数默认值在定义函数时,我们可以同时为参数指定默认值,被指定默认值的参数在调用时是可选的: >>> def area(length, width = None): ... """计算长方形面积 ... ... :param length: 长 ... :param width: 宽,默认为None;省略时计算以length为边长的正方形面积 ... :return: 长方形面积 ... """ ... if width is None: ... width = length ... return length * width ... >>> print(area(4, 3)) 12 >>> print(area(4)) 16 注意:形参的默认值只在函数定义时计算一次,如果参数的默认值是可变类型,那么函数的多次调用就可能会相互影响。例如下面的函数会累积后续调用时传递的参数: >>> def f(a, l=[]): ... l.append(a) ... return l ... >>> print(f(1)) [1] >>> print(f(2)) [1, 2] # 推荐如下方式解决 >>> def f(a, l=None): ... if l is None: ... l = [] ... l.append(a) ... return l ... >>> print(f(1)) [1] >>> print(f(2)) [2] 关键字传参默认情况下,? # 还是使用前面一个小节(参数默认值)的 area 函数
# 关键字传参,未按定义顺序
>>> print(area(width=2, length=4))
8
# 位置传参和关键字传参混用
>>> print(area(8, width=4))
32
# 关键字传参在位置传参之前,报错
>>> print(area(length=1, 2))
File "<input>", line 1
print(area(length=1, 2))
^
SyntaxError: positional argument follows keyword argument
可变参数在我们定义函数时,不确定调用函数时会传入多少个参数的情况下,可以使用可变参数来匹配,可变参数以? >>> def calc(base, *args, operation="+"):
... match operation:
... case "+":
... for i in args:
... base += i
... return base
... case "*":
... for i in args:
... base *= i
... return base
... case _:
... return "error"
...
# 传参时,10 匹配给base;1, 2, 3匹配给可变参数args;operation为默认值,
# 想要覆盖 operation 默认值必须使用关键字传参,否则会匹配给可变参数
>>> print(calc(10, 1, 2, 3))
16
# 传参时,10 匹配给base;1, 2, 3匹配给可变参数;operation通过关键字传参改为*
>>> print(calc(1, 1, 2, 3, operation="*"))
6
# 关键字传参不能位于位置传参之前
>>> print(calc(base = 0, 1, 2, 3))
File "<input>", line 1
print(calc(base = 0, 1, 2, 3))
^
SyntaxError: positional argument follows keyword argument
关键字参数通过前面的讲解,我们已经知道调用函数时可以通过关键字传参。当我们传递的关键字参数不能被函数中定义的形参完全匹配时,我们可以通过关键字参数来获取剩余未匹配的变量,关键字参数以? >>> def calc(base, *args, operation="+", **others):
... if len(others) > 0:
... print("invalid: more keyword arguments:", others)
... return None
... match operation:
... case "+":
... for i in args:
... base += i
... return base
... case "*":
... for i in args:
... base *= i
... return base
... case _:
... return "error"
...
>>> print(calc(1, 1, 2, 3, operation="*"))
6
>>> print(calc(1, 1, 2, 3, operation="*", otherOne = 12, otherTwo = 13))
invalid: more keyword arguments: {'otherOne': 12, 'otherTwo': 13}
None
提示:?位置参数必须在关键字参数之前?。很容易理解,因为前面已经讲过:位置传参必须在关键字传参之前。 特殊参数?
|
|
|
|
|
| 上一篇文章 下一篇文章 查看所有文章 |
|
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
| 360图书馆 购物 三丰科技 阅读网 日历 万年历 2025年12日历 | -2025/12/7 12:37:36- |
|
| 网站联系: qq:121756557 email:121756557@qq.com IT数码 |