在 Python 的编程世界里,有许多实用的特性和工具,它们能帮助我们更高效、更简洁地编写代码。今天,我们就来深入总结一下 Python 推导式以及常见语句和内置函数。
一、Python 推导式
Python 推导式是一种独特而强大的语法,它能让我们以简洁的方式从一个可迭代对象创建新的数据结构,如列表、集合、字典等。推导式主要分为以下几种类型:
1.1 列表推导式
列表推导式是最常用的推导式之一,它的基本语法如下:
[expression for item in iterable if condition] |
这里的expression是对每个item进行操作后生成新列表元素的表达式,item是从iterable(可迭代对象,如列表、元组、字符串、range 等)中迭代取出的元素,if condition是可选的过滤条件,只有满足该条件的item才会参与expression的运算并被添加到新列表中。
例如,生成一个包含 1 到 10 的平方的列表:
squares = [i**2 for i in range(1, 11)] print(squares) |
输出:[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
如果我们只想获取 1 到 10 中的偶数的平方,可以添加过滤条件:
even_squares = [i**2 for i in range(1, 11) if i % 2 == 0] print(even_squares) |
输出:[4, 16, 36, 64, 100]
列表推导式还支持多层嵌套,这相当于嵌套循环。比如,将一个二维列表展平为一维列表:
matrix = [[1, 2], [3, 4], [5, 6]] flattened = [num for row in matrix for num in row] print(flattened) |
输出:[1, 2, 3, 4, 5, 6]
1.2 字典推导式
字典推导式用于快速创建字典,语法如下:
{key_expression: value_expression for item in iterable if condition} |
例如,将一个包含学生名字和成绩的列表,转换为以名字为键,成绩为值的字典:
students = [('Alice', 90), ('Bob', 85), ('Charlie', 95)] grades_dict = {name: grade for name, grade in students} print(grades_dict) |
输出:{'Alice': 90, 'Bob': 85, 'Charlie': 95}
也可以对值进行一些操作,比如将成绩都加上 5 分:
new_grades_dict = {name: grade + 5 for name, grade in students} print(new_grades_dict) |
输出:{'Alice': 95, 'Bob': 90, 'Charlie': 100}
1.3 集合推导式
集合推导式和列表推导式类似,但生成的是集合,集合中的元素是唯一的,语法如下:
{expression for item in iterable if condition} |
例如,从一个列表中获取所有不重复的单词的首字母:
words = ["apple", "banana", "cherry", "apple", "date"] first_letters = {word[0] for word in words} print(first_letters) |
输出:{'a', 'b', 'c', 'd'}
1.4 生成器推导式
生成器推导式和列表推导式很像,但它返回的是一个生成器对象,而不是一个列表。生成器对象是一种可迭代对象,它不会一次性生成所有元素,而是在需要时才生成,这在处理大数据集时能节省大量内存。语法如下:
(expression for item in iterable if condition) |
例如,生成一个包含 1 到 10 的平方的生成器对象:
squares_generator = (i**2 for i in range(1, 11)) print(squares_generator) |
输出:<generator object <genexpr> at 0x7f19867d8d00>
要获取生成器中的元素,可以使用for循环遍历它:
for square in squares_generator: print(square) |
输出:
1 4 9 16 25 36 49 64 81 100 |
或者使用next()函数逐个获取元素,但要注意当没有更多元素时会抛出StopIteration异常:
squares_generator = (i**2 for i in range(1, 4)) print(next(squares_generator)) print(next(squares_generator)) print(next(squares_generator)) # print(next(squares_generator)) # 这行会抛出StopIteration异常 |
输出:
1 4 9 |
二、常见语句
Python 中有许多常见语句,它们是构建程序逻辑的基础。
2.1 赋值语句
赋值语句用于给变量赋值,是最基本的语句之一。可以单个变量赋值:
a = 10 |
也可以同时给多个变量赋值:
x, y = 5, 8 |
甚至可以进行解包赋值,比如将一个列表的元素分别赋值给多个变量:
nums = [1, 2, 3] a, b, c = nums print(a, b, c) |
输出:1 2 3
2.2 条件语句
条件语句用于根据条件执行不同的代码块,主要由if、elif(else if 的缩写)和else组成。语法如下:
if condition1: # 当condition1为True时执行的代码块 pass elif condition2: # 当condition1为False且condition2为True时执行的代码块 pass else: # 当condition1和condition2都为False时执行的代码块 pass |
例如,判断一个数是正数、负数还是零:
num = -5 if num > 0: print("正数") elif num == 0: print("零") else: print("负数") |
输出:负数
2.3 循环语句
循环语句用于重复执行一段代码,Python 中有for循环和while循环。
for循环通常用于遍历可迭代对象,语法如下:
for item in iterable: # 对每个item执行的代码块 pass |
例如,遍历一个列表并打印每个元素:
fruits = ["apple", "banana", "cherry"] for fruit in fruits: print(fruit) |
输出:
apple banana cherry |
while循环则根据条件判断是否继续循环,语法如下:
while condition: # 当condition为True时执行的代码块 pass |
例如,计算 1 到 10 的累加和:
sum_num = 0 i = 1 while i <= 10: sum_num += i i += 1 print(sum_num) |
输出:55
2.4 函数定义语句
函数定义语句用于定义可重用的代码块,使用def关键字,语法如下:
def function_name(parameters): # 函数体 return value |
例如,定义一个计算两个数之和的函数:
def add(a, b): return a + b result = add(3, 5) print(result) |
输出:8
2.5 导入语句
导入语句用于导入其他模块或库中的功能,使我们能够使用它们提供的函数、类等。最常用的导入语句是import和from...import。
使用import语句导入整个模块:
import math print(math.sqrt(25)) |
输出:5.0
使用from...import语句从模块中导入特定的函数或类等:
from math import sqrt print(sqrt(16)) |
输出:4.0
2.6 异常处理语句
异常处理语句用于捕获和处理程序运行时可能发生的错误,避免程序崩溃。主要由try、except和finally组成,语法如下:
try: # 可能会引发异常的代码块 pass except ExceptionType1: # 捕获到ExceptionType1类型异常时执行的代码块 pass except ExceptionType2: # 捕获到ExceptionType2类型异常时执行的代码块 pass else: # 当try代码块没有引发异常时执行的代码块 pass finally: # 无论try代码块是否引发异常,都会执行的代码块 pass |
例如,处理除以零的异常:
try: result = 10 / 0 except ZeroDivisionError: print("不能除以零") finally: print("执行结束") |
输出:
不能除以零 执行结束 |
2.7 断言语句
断言语句用于在程序中插入检查点,确保某个条件为真。使用assert关键字,语法如下:
assert condition, "optional error message" |
例如,确保一个函数的输入参数是正数:
def square(x): assert x > 0, "输入参数必须是正数" return x ** 2 # print(square(-2)) # 这行会触发断言错误 print(square(3)) |
输出:9
2.8 上下文管理器语句
上下文管理器语句用于管理资源的分配和释放,使用with关键字,它能确保在代码块执行结束后,相关资源会被正确关闭或清理。例如,使用with语句打开文件,文件会在代码块结束后自动关闭:
with open("test.txt", "r") as f: content = f.read() print(content) |
这里不需要显式调用f.close()来关闭文件,with语句会自动处理。
2.9 表达式语句
表达式语句用于计算表达式的值,例如print(2 + 3)就是一个表达式语句,它会计算2 + 3的值并打印出来。
2.10 空语句
空语句使用pass关键字,它不执行任何操作,通常用于占位,比如在定义一个函数但暂时不想写函数体时:
def my_function(): pass |
三、内置函数
Python 提供了丰富的内置函数,这些函数无需导入额外的模块即可直接使用,涵盖了各种常见任务,极大地提高了编程效率。
3.1 基本功能函数
- print():用于将内容输出到控制台。例如print("Hello, Python!")会在控制台打印出Hello, Python!。
- len():返回对象(如字符串、列表、元组、集合、字典等)的长度。例如print(len("hello"))输出5,print(len([1, 2, 3]))输出3。
- type():返回对象的类型。比如print(type(10))输出<class 'int'>,print(type("abc"))输出<class 'str'>。
- id():返回对象的唯一标识符,这个标识符在对象的生命周期内是唯一的。例如a = 10; print(id(a))会输出一个表示a对象唯一标识的整数。
3.2 数据类型转换函数
- int():将值转换为整数类型。例如print(int("123"))输出123,print(int(3.14))输出3。
- float():将值转换为浮点数类型。比如print(float("3.14"))输出3.14,print(float(5))输出5.0。
- str():将值转换为字符串类型。例如print(str(123))输出'123',print(str([1, 2, 3]))输出'[1, 2, 3]'。
- list():将可迭代对象转换为列表。如print(list((1, 2, 3)))输出[1, 2, 3],print(list("abc"))输出['a', 'b', 'c']。
- tuple():将可迭代对象转换为元组。例如print(tuple([1, 2, 3]))输出(1, 2, 3),print(tuple("xyz"))输出('x', 'y', 'z')。
- set():将可迭代对象转换为集合,同时会去重。比如print(set([1, 2, 2, 3]))输出{1, 2, 3},print(set("aabbcc"))输出{'a', 'b', 'c'}。
- dict():创建一个字典。可以通过多种方式创建,如print(dict(a = 1, b = 2))输出{'a': 1, 'b': 2},print(dict([('a', 1), ('b', 2)]))也输出{'a': 1, 'b': 2}。
3.3 数学函数
- abs():返回数字的绝对值。例如print(abs(-5))输出5,print(abs(3.14))输出3.14。
- round():返回浮点数四舍五入的结果。print(round(3.14159, 2))输出3.14,表示将3.14159保留两位小数。
- max():返回可迭代对象中的最大值。例如print(max([1, 3, 5, 2]))输出5,print(max("abc", key = len))输出'abc'(这里通过key参数指定按字符串长度比较)。
- min():返回可迭代对象中的最小值。比如print(min([4, 2, 7, 1]))输出1,print(min("xyz", key = lambda x: ord(x[0])))输出'x'(通过lambda函数指定按首字符的 ASCII 码值比较)。
- sum():返回可迭代对象中所有元素的总和。例如print(sum([1, 2, 3, 4]))输出10,print(sum((1.5, 2.5, 3.5), 10))输出17.5(第二个参数10表示初始值)。
- pow():返回基数的指数次方。print(pow(2, 3))输出8,print(pow(2, 3, 5))输出3(第三个参数表示取余,即2 ** 3 % 5)。
- divmod():返回商和余数。例如print(divmod(10, 3))输出(3, 1),表示10除以3的商是3,余数是1。
- isinstance():检查对象是否是指定类型的实例。print(isinstance(10, int))输出True,print(isinstance("abc", list))输出False。
- all():检查可迭代对象中的所有元素是否为真。例如print(all([1, True, "abc"]))输出True,print(all([0, False, ""]))输出False(因为0、False、空字符串在布尔上下文中被视为False)。
- any():检查可迭代对象中是否有任意元素为真。比如print(any([0, False, "abc"]))输出True,print(any([0, False, ""]))输出False。
3.4 序列和集合操作函数
- sorted():返回一个排序后的列表。print(sorted([3, 1, 4, 1, 5, 9]))输出[1, 1, 3, 4, 5, 9],print(sorted("banana", reverse = True))输出['n', 'n', 'a', 'a', 'b'](reverse = True表示降序排序)。
reversed():返回一个反转后的可迭代对象, 它不会修改原序列,而是生成一个新的反转迭代器。例如:
nums = [1, 2, 3, 4, 5] reversed_nums = reversed(nums) print(list(reversed_nums)) # 输出 [5, 4, 3, 2, 1] print(nums) # 原列表不变,输出 [1, 2, 3, 4, 5] |
- enumerate():用于将一个可迭代对象组合为一个索引序列,同时列出数据和数据下标,一般用在for循环当中。语法为enumerate(iterable, start=0),start参数用于指定起始索引,默认为 0。例如:
fruits = ["apple", "banana", "cherry"] for index, fruit in enumerate(fruits): print(index, fruit) |
输出:
0 apple 1 banana 2 cherry |
如果指定start=1:
for index, fruit in enumerate(fruits, start=1): print(index, fruit) |
输出:
1 apple 2 banana 3 cherry |
- zip():用于将多个可迭代对象中对应的元素打包成一个个元组,然后返回由这些元组组成的迭代器。如果各个可迭代对象的长度不一致,则返回的迭代器长度与最短的可迭代对象相同。例如:
names = ["Alice", "Bob", "Charlie"] ages = [25, 30, 35] zipped = zip(names, ages) print(list(zipped)) # 输出 [('Alice', 25), ('Bob', 30), ('Charlie', 35)] |
当可迭代对象长度不同时:
nums1 = [1, 2, 3] nums2 = [4, 5] zipped = zip(nums1, nums2) print(list(zipped)) # 输出 [(1, 4), (2, 5)] |
3.5 其他常用内置函数
- range():生成一个整数序列,常用于for循环中。语法为range(start, stop, step),start表示起始值(默认为 0),stop表示结束值(不包含),step表示步长(默认为 1)。例如:
for i in range(5): print(i) |
输出:
0 1 2 3 4 |
for i in range(2, 10, 2): print(i) |
输出:
2 4 6 8 |
- open():用于打开一个文件,并返回一个文件对象。通过文件对象可以对文件进行读写等操作。语法为open(file, mode='r', buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None),其中file是文件路径,mode是打开模式(r表示只读,w表示写入,a表示追加等)。例如,读取文件内容:
with open("test.txt", "r") as f: content = f.read() print(content) |
- help():用于获取对象的帮助信息。例如help(str)会显示字符串类型的帮助信息,help(print)会显示print()函数的帮助信息。
- dir():返回对象的所有属性和方法列表。例如print(dir(str))会列出字符串类型的所有属性和方法。
- hash():返回对象的哈希值。哈希值是一个整数,在字典中用于快速查找键。可哈希的对象(如整数、字符串、元组等)可以作为字典的键,而不可哈希的对象(如列表、字典等)则不能。例如print(hash(10))输出一个整数,print(hash("abc"))也输出一个整数。
- globals():返回当前全局变量的字典。
- locals():返回当前局部变量的字典。
- eval():用于执行一个字符串表达式,并返回表达式的值。例如print(eval("1 + 2 * 3"))输出7,print(eval("'hello' + 'world'"))输出'helloworld'。但使用eval()时要注意安全,避免执行不可信的字符串。
- exec():用于执行动态生成的 Python 代码。与eval()不同的是,exec()可以执行多个语句,并且不返回值。例如:
code = """ a = 10 b = 20 print(a + b) """ exec(code) # 输出 30 |
四、总结
Python 的推导式为我们提供了简洁高效的方式来创建列表、字典、集合和生成器,大大简化了代码的编写。常见语句是构建程序逻辑的基础,从简单的赋值、条件判断、循环,到函数定义、异常处理等,每一种语句都有其特定的用途,合理运用它们能让程序结构更清晰、逻辑更严谨。
而丰富的内置函数则是 Python 的一大优势,它们涵盖了数据处理、数学计算、序列操作等多个方面,无需我们重复造轮子,就能完成各种常见任务,提高编程效率。
掌握这些知识,能让我们在 Python 编程的道路上更加得心应手,写出更简洁、高效、易维护的代码。在实际编程中,还需要不断练习和实践,才能真正熟练运用这些特性和工具,解决实际问题。