作为一位有近20年C#开发经验的老程序员,看着编程语言不断的发展,总是想再学一门流行的编程语言。其实学习一门高级语言并没有难度。只是,如果并不使用这门语言做开发,还是会很快忘记。真正能更好的掌握一门编程语言是不断的使用它,认清自己需要什么,并在这个语言里面找到它的使用方法。
本文介绍一些C#程序员比较陌生的python特性。
一、关键字参数展开
关键字参数展开语法使用两个星号(**)来将字典中的键值对作为关键字参数传递给函数。这种语法允许你在调用函数时动态地传递参数。
例如,假设有一个函数如下:
def greet(name, age):
print(f"Hello, my name is {name} and I am {age} years old.")
你可以使用关键字参数展开语法来传递参数:
params = {'name': 'Alice', 'age': 30}
greet(**params)
这将输出:
Hello, my name is Alice and I am 30 years old.
关键字参数展开语法的主要优点是它使代码更加灵活和简洁,特别是在处理动态参数时。
但要注意,如果使用关键字参数展开语法传递的字典中包含函数定义中没有的参数,会报错。Python会抛出一个TypeError异常。
例如:
def greet(name, age):
print(f"Hello, my name is {name} and I am {age} years old.")
params = {'name': 'Alice', 'age': 30, 'gender': 'female'}
greet(**params)
这段代码会抛出以下错误:
TypeError: greet() got an unexpected keyword argument 'gender'
为了避免这种错误,你可以在函数定义中使用**kwargs来捕获所有未定义的关键字参数:
def greet(name, age, **kwargs):
print(f"Hello, my name is {name} and I am {age} years old.")
if 'gender' in kwargs:
print(f"Gender: {kwargs['gender']}")
params = {'name': 'Alice', 'age': 30, 'gender': 'female'}
greet(**params)
这样,代码将正常运行并输出:
Hello, my name is Alice and I am 30 years old.
Gender: female
二、列表推导式
列表推导式是Python中的一种简洁且强大的创建列表的方法。它允许你使用单行代码生成一个新的列表。基本语法如下:
[表达式 for 元素 in 可迭代对象 if 条件]
其中:
表达式是你想要放入列表中的元素,可以是对元素的某种操作。元素是从可迭代对象(如列表、元组、字符串等)中取出的每个项目。可迭代对象是你要迭代的对象。条件是一个可选的过滤条件,只有满足条件的元素才会被包含在生成的列表中。
示例:
- 创建一个包含1到10的平方的列表:
squares = [x**2 for x in range(1, 11)]
print(squares)
# 输出: [1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
- 创建一个包含1到10中偶数的平方的列表:
even_squares = [x**2 for x in range(1, 11) if x % 2 == 0]
print(even_squares)
# 输出: [4, 16, 36, 64, 100]
- 将一个字符串中的每个字符转换为大写:
uppercase_chars = [char.upper() for char in "hello"]
print(uppercase_chars)
# 输出: ['H', 'E', 'L', 'L', 'O']
列表推导式不仅简洁,而且通常比使用传统的for循环更高效。
三、切片操作
切片操作是一种从序列(如列表、元组、字符串等)中提取子序列的方式。切片操作使用冒号(:)分隔起始索引、结束索引和步长。基本语法如下:
序列[起始索引:结束索引:步长]
其中:
起始索引是切片开始的位置(包含该位置)。结束索引是切片结束的位置(不包含该位置)。步长是切片的步进值(默认为1)。
- 从列表中提取子列表:
numbers = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
sub_list = numbers[2:5]
print(sub_list)
# 输出: [2, 3, 4]
- 提取从起始位置到某个位置的子列表:
sub_list_start = numbers[:4]
print(sub_list_start)
# 输出: [0, 1, 2, 3]
- 提取从某个位置到结束位置的子列表:
sub_list_end = numbers[6:]
print(sub_list_end)
# 输出: [6, 7, 8, 9]
- 使用负索引进行切片:
sub_list_negative = numbers[-5:-2]
print(sub_list_negative)
# 输出: [5, 6, 7]
- 使用步长进行切片:
sub_list_step = numbers[1:8:2]
print(sub_list_step)
# 输出: [1, 3, 5, 7]
- 反向切片:
reverse_list = numbers[::-1]
print(reverse_list)
# 输出: [9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
切片操作非常灵活,可以用于各种序列类型,并且支持负索引和步长,使得从序列中提取子序列变得非常方便。
四、多变量赋值
多变量赋值是一种简洁的语法,可以在一行代码中同时为多个变量赋值。以下是一些示例:
1.基本多变量赋值
a, b, c = 1, 2, 3
print(a) # 输出: 1
print(b) # 输出: 2
print(c) # 输出: 3
2.交换变量值
x, y = 5, 10
x, y = y, x
print(x) # 输出: 10
print(y) # 输出: 5
3.从列表或元组中赋值
data = [4, 5, 6]
a, b, c = data
print(a) # 输出: 4
print(b) # 输出: 5
print(c) # 输出: 6
4.使用星号解包
a, *b, c = [1, 2, 3, 4, 5]
print(a) # 输出: 1
print(b) # 输出: [2, 3, 4]
print(c) # 输出: 5
本文先介绍这些,再次体会到了python的简洁和灵活。
2108

被折叠的 条评论
为什么被折叠?



