Python 常用语句:修订间差异

来自牛奶河Wiki
跳到导航 跳到搜索
第54行: 第54行:


=== 动态执行 ===
=== 动态执行 ===
1. eval() 函数用于计算一个 Python 表达式。
1. eval() 函数用于计算一个 Python 表达式,并取得返回值。
  eval(expression)
  eval(expression)


第61行: 第61行:
  result = add(5, 3)
  result = add(5, 3)


2. exec() 函数用于执行一段 Python 代码。
2. exec() 函数用于执行一段 Python 代码,返回值 None。
  exec(Python Code)
  exec(Python Code)



2025年3月19日 (三) 11:19的版本

Dict

Python 字典的顺序问题取决于 Python 的版本:

  • 3.7 及以后版本,字典保持插入顺序,语言规范特性
  • 3.6 CPython 的字典保持插入顺序,非语言规范的一部分,不应该依赖这个行为,因为其他(如 Jython 或 IronPython)可能不保持插入顺序
  • 3.5 及更早版本,字典不保持插入顺序。遍历字典时,键值对的顺序是不可预测的

第一个 Key

# d1={'a':1, 'b':2}
next(iter(d1))

最后一个 Key

list(d1.keys())[-1]

defaultdict

内置字典 dict 的一个子类,可以自动为不存在的键提供一个默认值,从而避免了在访问字典时常见的 KeyError 异常。

from collections import defaultdict

dd1 = defaultdict(int)
dd1['a'] += 1   # 无论 a 是否已经存在,都可以直接累加

dd2 = defaultdict(list)
dd2['a'].append(1)   # 自动创建一个空列表

dd3 = defaultdict(lambda: {"total": 0, "ok": 0, "err": 0})
dd3['a']['total'] += 1    # 键不存在时,自动调用 lambda 函数,返回字典

lambda

lambda 表达式(也称为匿名函数)是一种创建小型、一次性使用的函数的简洁方式。通常用于需要一个简单函数作为参数的场景,例如在 map()、filter()、sorted() 等高阶函数中。

语法

lambda arguments: expression
  • arguments: 参数列表,可以有零个或多个参数,用逗号分隔
  • expression: 单个表达式,求值并返回

Sample:

add = lambda x, y: x + y
result = add(5, 3)

max = lambda a, b: a if a > b else b
max(10, 5)

# map
numbers = [1, 2, 3, 4, 5]
squared_numbers = list(map(lambda x: x * x, numbers))
print(squared_numbers)  # 输出: [1, 4, 9, 16, 25]

# filter
numbers = [1, 2, 3, 4, 5, 6]
even_numbers = list(filter(lambda x: x % 2 == 0, numbers))
print(even_numbers)  # 输出: [2, 4, 6]

# sorted(),按元素的长度排序
words = ["apple", "banana", "kiwi", "orange"]
sorted_words = sorted(words, key=lambda x: len(x))
print(sorted_words)  # 输出: ['kiwi', 'apple', 'orange', 'banana']

动态执行

1. eval() 函数用于计算一个 Python 表达式,并取得返回值。

eval(expression)
exp = 'lambda x, y: x + y'
add = eval(exp)
result = add(5, 3)

2. exec() 函数用于执行一段 Python 代码,返回值 None。

exec(Python Code)
code = "print('Hello from exec!')"
exec(code)  # 执行代码

极度危险的例子

code = input("Enter some Python code: ")
exec(code)
# 用户可以输入 "import os; os.system('ls -l /')" 查看系统信息,恶意用户甚至可以删除整个文件系统!