语法糖本质上是一种代码架构的优化方式,可以让代码更加简洁、易读、优雅。python3中有很多适用的语法糖例如:列表推导式、集合推导式、字典推导式、 生成器表达式等等,学会这些语法糖,开发效率才会事半功倍。
文章目录
用一行代码生成一个新的列表,而不用写迭代的循环。例如,从一个列表中选出所有的偶数。
numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
even_numbers = [n for n in numbers if n % 2 == 0]
print(even_numbers)
同样的,用一行代码生成一个新的集合。例如,从一个列表中选出所有的偶数解析成集合。
numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
even_numbers = {n for n in numbers if n % 2 == 0}
print(even_numbers)
用一行代码生成一个新的字典,而不用写迭代的循环。例如,将一个名字列表转换成字典形式的键值对。
names = ["Alice", "Bob", "Charlie"]
name_dict = {name: len(name) for name in names}
print(name_dict)
用一行代码生成一个新的生成器,而不用写迭代的循环。例如,从一个列表中选出所有的偶数以生成一个生成器对象。
numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
even_numbers = (n for n in numbers if n % 2 == 0)
print(even_numbers)
用于对函数进行修饰,可以在不修改函数代码的情况下,给函数增加新的功能。例如,可以在输出函数名称的同时,增加函数执行时长记录的功能。
import time
def time_counter(func):
def wrapper(*args, **kwargs):
start_time = time.time()
result = func(*args, **kwargs)
print("Function %s elapsed time: %s seconds" % (func.__name__, time.time() - start_time))
return result
return wrapper
@time_counter
def my_function():
for i in range(100000000):
pass
my_function()
常用于函数式编程,可以用一行代码定义一个简单的函数,省去函数定义的步骤。例如,将一个列表中的元素按照字符串长度排序。
names = ["Alice", "Bob", "Charlie", "David", "Ed"]
names.sort(key=lambda name: len(name))
print(names)
用一种方便的方式对字符串进行格式化,而不用写长长的字符串拼接过程。例如,输出欢迎信息。
name = "Alice"
age = 28
print("Welcome, %s. You are %d years old" % (name, age))
一个有多个元素的可迭代对象可以一次性被拆开,赋值给多个变量。例如,交换两个变量的值。
a = 3
b = 5
a, b = b, a
print(a, b)
类中的静态方法,用于在类内部封装一些不需要访问实例属性或实例方法的行为。例如,定义一个圆形类,通过静态方法计算圆形的面积。
class Circle:
pi = 3.14
def __init__(self, radius):
self.radius = radius
@staticmethod
def calc_area(radius):
return Circle.pi * radius * radius
circle = Circle(5)
print(circle.calc_area(5))
类中的类方法,用于指定方法的第一个参数为类对象而不是实例对象。例如,定义一个矩形类,通过类方法计算矩形的面积。
class Rectangle:
def __init__(self, width, height):
self.width = width
self.height = height
@classmethod
def from_square(cls, width):
return cls(width, width)
def calc_area(self):
return self.width * self.height
square = Rectangle.from_square(5)
print(square.calc_area())