包含:调用函数、定义函数、函数的参数、递归函数
输出结果都写在了注释中
# 求绝对值
print(abs(-12.34))
# 12.34
# 求最大最小值
print(max(1,5,2,-3),min(1,5,2,-3))
# 5 -3
# 数据类型转换函数:int(),float(),str(),bool()
print(int(12.34))
# 12
print(float(12))
# 12.0
print(str(1.234))
# 1.234
print(bool(12),bool(0),bool('0')) # '0'表示字符
# True False True
# hex()函数:
# 把一个整数转换成十六进制表示的字符串
print(hex(10),hex(15),hex(17))
# 0xa 0xf 0x11
# def自定义函数
def my_abs(x):
if x > 0:
return x
else:
return -x
print(my_abs(-100))
# 100
# 空函数
# pass可以用来作为占位符,比如现在还没想好怎么写函数的代码,就可以先放一个pass,让代码能运行起来
def nop():
pass
# isinstance()函数:
# 数据类型检查
def my_abs(x):
if not isinstance(x,(int,float)): # 检查x是否是int或float类型
raise TypeError('bad operand type')
if x > 0:
return x
else:
return -x
# 递归函数
def fact(n):
if n == 1:
return n
return n * fact(n-1)
print(fact(5))
# 120
参数类型 | 定义 | 语法示例 | 调用方式 | 传值方式 | 典型应用场景 |
---|---|---|---|---|---|
必选参数 | 调用时必须传入的参数,无默认值 | def func(a, b): |
按位置或关键字传递 | 必须显式传值,否则报错 | 函数必须依赖的基础参数 |
默认参数 | 定义时赋予默认值,调用时可省略 | def func(a, b=1): |
按位置或关键字传递;可省略有默认值的参数 | 未传值时使用默认值 | 可选参数或常用配置 |
可变参数 | 接收任意数量的位置参数,打包为元组 | def func(*args): |
按位置传递多个参数,如 func(1, 2, 3) |
自动将多个位置参数合并为元组 args |
处理不定长位置参数(如求和、拼接) |
命名关键字参数 | 强制要求参数以关键字形式传递(需用 * 分隔或跟在可变参数后) |
def func(a, *, b) 或 def func(a, *args, b): |
必须使用关键字传值,如 func(a=1, b=2) 或 func(1, 2, 3, b=4) |
直接通过参数名赋值 | 明确参数含义,避免歧义 |
关键字参数 | 接收任意数量的关键字参数,打包为字典 | def func(**kwargs): |
按关键字传递多个参数,如 func(a=1, b=2) |
自动将多个关键字参数合并为字典 kwargs |
接受灵活配置或扩展参数 |
包含:切片、迭代、列表生成式、生成器、迭代器
输出结果都写在了注释中
# 切片Slice,对tuple同理
l = list(range(100))
print(l[0:10])
# [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
print(l[:5])
# [0, 1, 2, 3, 4]
print(l[-10:])
# [90, 91, 92, 93, 94, 95, 96, 97, 98, 99]
print(l[10:20])
# [10, 11, 12, 13, 14, 15, 16, 17, 18, 19]
print(l[:10:2]) # 每两个取一个
# [0, 2, 4, 6, 8]
print(l[::5])
# [0, 5, 10, 15, 20, 25, 30, 35, 40, 45, 50, 55, 60, 65, 70, 75, 80, 85, 90, 95]
# 迭代
d = {'a':1,'b':2,'c':3}
for key in d:
print(key)
# a
# b
# c
for value in d.values():
print(value)
# 1
# 2
# 3
for k,v in d.items():
print(k,v)
# a 1
# b 2
# c 3
for ch in 'ABC':
print(ch)
# A
# B
# C
# 通过collections.abc模块的Iterable类型判断一个对象是否是可迭代对象
from collections.abc import Iterable
print(isinstance ('abc',Iterable)) # str是否可迭代
print(isinstance([1,2,3], Iterable)) # list是否可迭代
print(isinstance(123, Iterable)) # 整数是否可迭代
# True
# True
# False
# enumerate()函数:
# 同时迭代索引和元素本身
for i,value in enumerate(['A','B','C']):
print(i,value)
# 0 A
# 1 B
# 2 C
for x,y in [(1,1),(5,3),(2,9)]:
print(x,y)
# 1 1
# 5 3
# 2 9
# 列表生成式
l = [x*x for x in range(1,11)]
print(l)
# [1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
l2 = [m + n for m in ['A','B','C'] for n in ['1','2','3']]
print(l2)
# ['A1', 'A2', 'A3', 'B1', 'B2', 'B3', 'C1', 'C2', 'C3']
# lower()和upper()函数:
# 转化为小写和大写
l = ['Hello', 'World', 'IBM', 'Apple']
l3 = [l3.lower() for l3 in l]
print(l3)
# ['hello', 'world', 'ibm', 'apple']
#if-else
# 在一个列表生成式中,for前面的if ... else是表达式,必须根据x计算出一个结果;
# 而for后面的if是过滤条件,不能带else
l4 = [x for x in range(1,11) if x%2 == 0]
print(l4)
# [2, 4, 6, 8, 10]
l5 = [x if x%2 == 0 else -x for x in range(1,11)]
print(l5)
# [-1, 2, -3, 4, -5, 6, -7, 8, -9, 10]
# 生成器generator
# 创建方法一:把一个列表生成式的[]改成()
g = (x * x for x in range(1,11))
print(g)
# at 0x000001D8DB242190>
# next()函数:
# 获得generator的下一个返回值
print(next(g))
print(next(g))
print(next(g))
# 1
# 4
# 9
# for循环遍历输出
for i in g:
print(i)
# 1
# 4
# 9
# 16
# 25
# 36
# 49
# 64
# 81
# 100
# 创建方法二:创建包含yield关键字的函数
def fib(n):
i,a,b = 0,0,1
while i < n:
yield b
a,b = b,a+b
i += 1
return 'done'
print(fib(6))
#
for i in fib(6):
print(i)
# 1
# 1
# 2
# 3
# 5
# 8
# 如果想要拿到返回值'done',必须捕获StopIteration错误,返回值包含在StopIteration的value中
g = fib(6)
while True:
try:
x = next(g)
print('g:', x)
except StopIteration as e:
print('Generator return value:', e.value)
break
凡是可作用于for
循环的对象都是Iterable
类型;
凡是可作用于next()
函数的对象都是Iterator
类型,它们表示一个惰性计算的序列;
集合数据类型如list
、dict
、str
等是Iterable
但不是Iterator
,不过可以通过iter()
函数获得一个Iterator
对象。
Python的for
循环本质上就是通过不断调用next()
函数实现的
廖雪峰的Python学习网站