变量与基本类型
Python 不需要声明类型,赋值即创建变量。用 type() 可以看当前类型。
name = "小明" # str 字符串
age = 18 # int 整数
height = 1.72 # float 浮点数
is_student = True # bool 布尔(注意首字母大写)
nothing = None # NoneType 空值
print(type(name), type(age), type(height), type(is_student))
print(age + 1, height * 2, name * 2) # 字符串可以 * 重复,不能和数字相加
print("年龄是 " + str(age)) # 拼接前必须显式转成字符串
print(f"年龄是 {age},明年 {age + 1}") # f-string,最常用的写法
字符串常用操作
s = " Hello, Python 世界 "
print(s.strip()) # 去掉首尾空格
print(s.lower(), s.upper())
print(s.replace("Python", "World"))
print(s.split(",")) # 按分隔符切成列表
print("-".join(["2026", "10", "04"]))
print(len(s), s.count("o"))
print("Python" in s) # 是否包含
print(s[2:7], s[-5:]) # 切片:左闭右开,负数从末尾数
print(s.find("Py")) # 找不到返回 -1
print("3.14", float("3.14"), int("42"))
print(f"{1234567.891:,.2f}") # 千分位 + 两位小数
print(f"{255:x} {255:b} {255:o}") # 十六进制 / 二进制 / 八进制
列表 list
nums = [5, 2, 9, 1, 7]
nums.append(3) # 末尾加一个
nums.insert(0, 100) # 指定位置插入
nums.remove(9) # 删掉第一个等于 9 的元素
last = nums.pop() # 弹出末尾
print(nums[0], nums[-1], nums[1:3])
print(len(nums), max(nums), min(nums), sum(nums), sorted(nums))
print(sorted(nums, reverse=True)) # 从大到小
nums.sort() # 原地排序,返回 None(常见坑)
print([x * 2 for x in nums]) # 列表推导式
print([x for x in nums if x % 2 == 0])
print(list(range(1, 6)), list(range(0, 10, 2)))
matrix = [[1, 2], [3, 4]]
print(matrix[1][0], [row[0] for row in matrix])
元组、集合、字典
point = (3, 4) # 元组:不可修改,常用于返回多个值
x, y = point # 解包
print(x, y)
tags = {"python", "web", "python"} # 集合:自动去重、无序
print(tags, "web" in tags)
print(tags & {"web", "ai"}, tags | {"db"}, tags - {"web"})
scores = {"语文": 88, "数学": 92}
scores["英语"] = 79 # 新增 / 修改
print(scores.get("物理")) # 不存在返回 None,不会报错
print(scores.get("物理", 0)) # 不存在返回默认值
print(scores["数学"]) # 不存在会抛 KeyError
del scores["英语"]
for k, v in scores.items():
print(k, v)
print(list(scores.keys()), list(scores.values()))
条件与循环
score = 76
if score >= 90:
print("优秀")
elif score >= 60:
print("及格")
else:
print("不及格")
# Python 用缩进表示代码块,通常是 4 个空格,同一个块必须一致
for i in range(5): # 0,1,2,3,4
print(i, end=" ") # end 控制结尾不换行
print()
for name in ["小明", "小红"]:
print(name)
for i, name in enumerate(["a", "b", "c"], start=1):
print(i, name)
for k, v in {"x": 1}.items():
print(k, v)
n = 3
while n > 0:
n -= 1 # 没有 n-- 这种写法
if n == 1:
continue # 跳过本次剩下的代码,直接进入下一轮判断
print("n =", n)
print("循环结束,n =", n)
# break 跳出整个循环;for / while 后面还能跟 else,只有没被 break 时才执行
for i in range(3):
if i == 99:
break
else:
print("循环正常结束(没触发 break)才会打印这句")
函数
def add(a, b):
return a + b
def greet(name, greeting="你好"): # 默认参数必须放在后面
return f"{greeting}, {name}"
def info(*args, **kwargs): # 任意个位置参数 / 关键字参数
print(args, kwargs)
def swap(a, b):
return b, a # 返回元组
print(add(1, 2), greet("小明"), greet("小明", "早上好"))
info(1, 2, name="小明", age=18)
print(swap(1, 2))
# lambda:一行的小函数,常配合 sorted / map 使用
people = [{"n": "a", "age": 30}, {"n": "b", "age": 20}]
print(sorted(people, key=lambda p: p["age"]))
print(list(map(lambda x: x * 2, [1, 2, 3])))
print(list(filter(lambda x: x > 1, [1, 2, 3])))
def fib(n): # 递归
return n if n < 2 else fib(n - 1) + fib(n - 2)
print([fib(i) for i in range(10)])
类
class Animal:
species_count = 0 # 类属性,所有实例共享
def __init__(self, name): # 构造方法
self.name = name # 实例属性
Animal.species_count += 1
def speak(self): # 实例方法第一个参数必须是 self
return f"{self.name} 发出了声音"
@staticmethod
def helper():
return "静态方法不需要 self"
def __str__(self): # print(对象) 时显示的内容
return f"<Animal {self.name}>"
class Dog(Animal): # 继承
def __init__(self, name, breed):
super().__init__(name) # 调用父类构造
self.breed = breed
def speak(self): # 重写
return f"{self.name} 汪汪"
d = Dog("旺财", "柴犬")
print(d.speak(), d.name, d.breed)
print(isinstance(d, Dog), isinstance(d, Animal))
print(d)
读取输入
本站用「输入 (stdin)」面板模拟键盘,程序里每调用一次 input() 就按顺序取一行。
name = input("请输入你的名字:") # 括号里是提示语,会打印出来
age = int(input("请输入年龄:")) # input() 永远返回字符串,要算数必须转换
print(f"{name} 明年 {age + 1} 岁")
# 一次读入多个数(用空格分隔)
a, b = map(int, input("两个数:").split())
print(a + b)
# 读到文件末尾(stdin 用尽)时会抛 EOFError,可以用 try 兜住
try:
line = input()
except EOFError:
print("没有更多输入了")
异常处理
def divide(a, b):
try:
result = a / b # 可能出错的代码放这里
except ZeroDivisionError as e:
print("捕获到除零:", e)
result = None
except TypeError as e:
print("类型不对:", e)
result = None
else:
print("try 里没有发生异常,才会执行 else")
finally:
print("无论有没有异常都执行,常用来关闭文件、释放资源")
return result
print(divide(10, 2))
print(divide(10, 0))
print(divide(10, "a"))
# 主动抛出与自定义异常
class MyError(Exception):
pass
def check(age):
if age < 0:
raise ValueError("年龄不能是负数")
return True
try:
check(-1)
except ValueError as e:
print("出错了:", e)
常用标准库
import math, random, json, datetime, collections, itertools
print(math.sqrt(16), math.floor(3.7), math.ceil(3.2), math.pi)
print(math.factorial(5), math.gcd(12, 18))
random.seed(42) # 固定种子,结果可复现
print(random.randint(1, 10), random.choice(["石头", "剪刀", "布"]))
print(random.sample(range(1, 34), 6), random.random())
print(json.dumps({"name": "小明", "age": 18}, ensure_ascii=False))
print(json.loads('{"a": 1}'))
print(datetime.date.today(), datetime.datetime.now().strftime("%Y-%m-%d %H:%M"))
print(collections.Counter("abracadabra").most_common(2))
print(collections.defaultdict(list))
print(list(itertools.permutations([1, 2, 3])))
print(list(itertools.combinations([1, 2, 3], 2)))
# 统计与分数
import statistics, fractions, decimal
print(statistics.mean([1, 2, 3, 4]), statistics.median([1, 2, 3]))
print(fractions.Fraction(1, 3) + fractions.Fraction(1, 6))
print(decimal.Decimal("0.1") + decimal.Decimal("0.2")) # 精确十进制
print(round(2.675, 2), round(0.1 + 0.2, 2)) # 浮点数的坑
打印与格式化
print("a", "b", "c", sep="-", end="!\n")
print(f"{3.14159:.2f}") # 保留两位小数
print(f"{42:>8}|{42:<8}|{42:^8}|") # 右对齐 / 左对齐 / 居中,宽度 8
print(f"{0.856:.1%}") # 百分比
print(f"{1234567:,}") # 千分位
for i in range(1, 5):
print("*" * i) # 文本图形靠字符串重复