语法篇
1.推导式
1.1 列表推导式
语法
new_list = [expression for item in iterable if condition]
其中:
expression
:对 item 进行计算的表达式。item
:从 iterable 中取出的每个元素。iterable
:可以迭代的对象,如列表、元组、集合、字符串等。condition
可选:一个布尔表达式,用于过滤 iterable 中的元素。
1.2 字典推导式
语法
new_dict = {key_expression: value_expression for item in iterable if condition}
其中:
key_expression
:生成字典键的表达式。value_expression
:生成字典值的表达式。item
:从 iterable 中取出的每个元素。iterable
:可以迭代的对象,如列表、元组、集合等。condition
可选:一个布尔表达式,用于过滤 iterable 中的元素。
示例:
numbers = [1, 2, 3, 4, 5]
squares_dict = {x: x**2 for x in numbers}
print(squares_dict) # 输出:{1: 1, 2: 4, 3: 9, 4: 16, 5: 25}
从列表创建一个新的字典。
even_squares_dict = {x: x**2 for x in numbers if x % 2 == 0}
print(even_squares_dict) # 输出:{2: 4, 4: 16}
只保留偶数的平方。
1.3 集合推导式
语法:
new_set = {expression for item in iterable if condition}
其中:
expression
:生成集合元素的表达式。item
:从 iterable 中取出的每个元素。iterable
:可以迭代的对象,如列表、元组、集合等。condition
可选:一个布尔表达式,用于过滤 iterable 中的元素。
示例:
numbers = [1, 2, 3, 4, 5]
squares_set = {x**2 for x in numbers}
print(squares_set) # 输出:{1, 4, 9, 16, 25}
创建一个新的集合。
even_squares_set = {x**2 for x in numbers if x % 2 == 0}
print(even_squares_set) # 输出:{4, 16}
只保留偶数的平方。
1.4 生成器表达式
语法:
generator = (expression for item in iterable if condition)
其中:
expression
:生成生成器元素的表达式。item
:从 iterable 中取出的每个元素。iterable
:可以迭代的对象,如列表、元组、集合等。condition
可选:一个布尔表达式,用于过滤 iterable 中的元素。
示例:
numbers = [1, 2, 3, 4, 5]
squares_gen = (x**2 for x in numbers)
print(list(squares_gen)) # 输出:[1, 4, 9, 16, 25]
创建一个生成器,其中包含每个元素的平方。
even_squares_gen = (x**2 for x in numbers if x % 2 == 0)
print(list(even_squares_gen)) # 输出:[4, 16]
只保留偶数的平方。
**
幂运算符
# 计算 2 的 3 次方
result = 2 ** 3
print(result) # 输出 8
字典参数解包
**
可以用于函数调用时 解包字典,将字典中的键值对作为命名参数传递给函数。
def greet(name, age):
print(f"Hello, my name is {name} and I am {age} years old.")
# 使用字典解包
person_info = {"name": "Alice", "age": 25}
greet(**person_info)
# 输出:Hello, my name is Alice and I am 25 years old.
定义函数时的关键字参数
在定义函数时,**kwargs
表示可以接受任意数量的关键字参数,并将它们打包成一个字典。
def my_function(**kwargs):
for key, value in kwargs.items():
print(f"{key} = {value}")
my_function(name="Alice", age=25, city="New York")
# 输出:
# name = Alice
# age = 25
# city = New York
定义枚举和常量
枚举
from enum import Enum
class Color(Enum):
RED = 1
GREEN = 2
BLUE = 3
# 访问枚举成员
print(Color.RED) # 输出 Color.RED
print(Color.RED.name) # 输出 'RED'
print(Color.RED.value) # 输出 1
- 枚举的成员是常量,值可以是整数、字符串等。
- 可以通过
name
属性获取枚举成员的名称,通过value
属性获取枚举成员的值。
遍历枚举
for color in Color:
print(color)
枚举比较
if Color.RED == Color.RED:
print("匹配") # 输出 '匹配'
使用 auto
自动赋值
from enum import Enum, auto
class Color(Enum):
RED = auto()
GREEN = auto()
BLUE = auto()
print(Color.RED.value) # 输出 1
print(Color.GREEN.value) # 输出 2
常量
Python 没有专门的语法定义常量,通常通过约定使用 全大写变量名 来表示常量。这种方式约定程序员不修改这些值,但 Python 并不会强制要求常量的不可变性。
# 定义常量
PI = 3.14159
GRAVITY = 9.8
SPEED_OF_LIGHT = 299792458 # 光速,单位为米/秒
# 使用常量
print(PI) # 输出 3.14159
访问权限
public
在 Python 中,所有未添加特殊前缀的变量或方法默认是 public(公共) 的,意味着它们可以被类外部访问。
class MyClass:
def __init__(self):
self.name = "Public Name" # 公共属性
def public_method(self):
return "This is a public method" # 公共方法
obj = MyClass()
print(obj.name) # 可以直接访问公共属性
print(obj.public_method()) # 可以直接调用公共方法
private
Python 中的私有成员是通过 命名约定 实现的。虽然 Python 不能像某些语言一样完全限制私有成员的访问,但通过在变量或方法名前加 双下划线 __
,可以启用名称改写(name mangling),使得类外部无法直接访问这些成员。
class MyClass:
def __init__(self):
self.__secret = "Private Name" # 私有属性
def __private_method(self):
return "This is a private method" # 私有方法
obj = MyClass()
# print(obj.__secret) # 会报错,无法直接访问私有属性
# print(obj.__private_method()) # 会报错,无法直接调用私有方法
Python 实现私有属性的一种方式是将变量名自动改写为 _类名__变量名
,因此虽然类外无法直接访问,但可以通过这种改写后的名字访问到。
print(obj._MyClass__secret) # 正确访问
print(obj._MyClass__private_method()) # 正确调用
protected
在 Python 中,没有真正的 protected 关键字,但通过 单下划线 _
作为前缀表示 受保护成员。这是一种约定,表明该成员是受保护的,不应该 从类外部直接访问,但它可以在子类中被访问和使用。
class MyClass:
def __init__(self):
self._protected = "Protected Name" # 受保护属性
def _protected_method(self):
return "This is a protected method" # 受保护方法
class SubClass(MyClass):
def access_protected(self):
return self._protected # 子类可以访问受保护成员
obj = SubClass()
print(obj._protected) # 可以访问,但不推荐
print(obj.access_protected()) # 子类可以正确访问受保护属性
最后更新于