Python从0到100(十三):函数的类型及其应用
一、递归函数和匿名函数
一个函数的内部可以调用其他函数。但是,如果一个函数在内部不调用其它的函数,而是自己本身的话,这个函数就是递归函数
。
使用递归,实现阶乘 n! = 1 * 2 * 3 * … * n的计算。
def fact(n):
if n==1:
return 1
return n * fact(n - 1)
Fact(5)
# 结果:120
# 过程:5*4*3*2*1
匿名函数就是没有名称的函数
,也就是不再使用def语句定义的函数。如果要声明匿名函数
,则需要使用lambda
关键字,匿名函数的声明格式如下所示:
lambda [arg1 [,arg2,.....argn]]:expression
匿名函数示例代码:
sum = lambda arg1, arg2: arg1 + arg2
print(“运行结果:", sum( 10, 20 ))
print("运行结果:", sum( 20, 20 ))
注意:
使用Lambda声明的匿名函数能接收任何数量的参数,但只能返回一个表达式的值。匿名函数不能直接调用print,因为lambda需要一个表达式。
二、日期时间函数
1.时间函数
在Python中,通常有如下几种方式表示时间:
(1)时间戳;
通常来讲,时间戳表示的是从1970年1月1日00:00:00开始按秒计算的偏移量。
import time; # 引入time模块
ticks = time.time()
print("当前时间戳为:", ticks)
### 当前时间戳为: 1642048647.1326923
(2)格式化的时间字符串;
我们可以使用time模块的strftime方法
来格式化日期。
import time
# 格式化成2016-03-20 11:45:39形式
print(time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()))
# 2022-01-13 12:38:08
(3)时间元组(struct_time)。
返回struct_time的函数主要有gmtime()、localtime()和strptime(),struct_time元组。
2.日历函数
1.calendar.calendar(year,w=2,l=1,c=6)
返回一个多行字符串格式的year年年历,3个月一行,间隔距离为c。每日宽度间隔为w字符。每行长度为21* W+18+2* C。l是每星期行数。
import calendar
print(calendar. firstweekday())
print(calendar.isleap(2018))
print(calendar.calendar(2021,w=1,l=1,c=6))
然后就可以得到我们的日期表了,是不是非常的nice:
2. 返回当前每周起始日期的设置。默认情况下,首次载入caendar模块时返回0,即星期一。
calendar. firstweekday()
3. 如果是闰年返回True,否则为false。
calendar.isleap(year)
4. 返回在Y1,Y2两年之间的闰年总数。
calendar.leapdays(y1,y2)
5. 返回一个多行字符串格式的year年month月日历,两行标题,一周一行。每日宽度间隔为w字符。每行的长度为7* w+6。l是每星期的行数。
print(calendar.month(2021,2,w=2,l=1))
6. 返回一个整数的单层嵌套列表。每个子列表装载代表一个星期的整数。Year年month月外的日期都设为0;范围内的日子都由该月第几日表示,从1开始。
calendar.monthcalendar(year,month)
7. 返回两个整数。第一个是该月的星期几的日期码,第二个是该月的日期码。日从0(星期一)到6(星期日);月从1到12。
calendar.monthrange(year,month)
8.calendar.prcal(year,w=2,l=1,c=6)
相当于print(calendar.calendar(year,w,l,c))
三、 随机数函数
1.random.random()
用于生成一个0到1的随机符点数: 0 <= n < 1.0。
import random# 生成第一个随机数
print("random():", random.random())# 生成第二个随机数
print("random():", random.random())
2.random.uniform(a,b)
返回a,b之间的随机浮点数,范围[a,b]或[a,b]取决 于四舍五入,a不一定要比b小。
3.random.randint(a,b)
返回a,b之间的整数,范围[a,b],注意:传入参数必须是整数,a一定要比b小。
4.random.randrang([start], stop[, step])
返回有个区间内的整数,可以设置step。只能传入整数,random.randrange(10, 100, 2),
结果相当于从[10, 12, 14, 16, … 96, 98]序列中获取一个随机数。
5.random.choice(sequence)
从sequence(序列,是有序类型的)中随机获取一个元素,列表、元组、字符串都属于sequence。
random.randrange(10,100,2)
#结果等效于
random.choice(range(10,100,2)
6.random.shuffle(x[,random])
用于将列表中的元素打乱顺序,俗称为洗牌。
p = ["Python","is", "powerful","simple”]
random.shuffle(p)
7.random.sample(sequence,k)
从指定序列中随机获取k个元素作为一个片段返回,
sample函数不会修改原有序列
list = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
slice = random.sample(list, 5)
print(slice)
print(list)
# [6, 9, 3, 1, 2]
# [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
四、函数的应用
1.生成验证码
import random
import string
ALL_CHARS = string.digits + string.ascii_letters
def generate_code(code_len=4):
return ''.join(random.choices(ALL_CHARS, k=code_len))
可以用下面的代码生成10组随机验证码来测试上面的函数。
for _ in range(10):
print(generate_code())
说明:
random
模块的sample
和choices
函数都可以实现随机抽样,sample
实现无放回抽样,这意味着抽样取出的字符是不重复的;choices
实现有放回抽样,这意味着可能会重复选中某些字符。这两个函数的第一个参数代表抽样的总体,而参数k
代表抽样的数量。
2.判定是不是质数
def is_prime(num: int) -> bool:
"""判断一个正整数是不是质数
:param num: 正整数
:return: 如果是质数返回True,否则返回False
"""
for i in range(2, int(num ** 0.5) + 1):
if num % i == 0:
return False
return num != 1
3.计算最大公约数和最小公倍数。
代码一:
def gcd_and_lcm(x: int, y: int) -> int:
"""求最大公约数和最小公倍数"""
a, b = x, y
while b % a != 0:
a, b = b % a, a
return a, x * y // a
代码二:
def gcd(x: int, y: int) -> int:
"""求最大公约数"""
while y % x != 0:
x, y = y % x, x
return x
def lcm(x: int, y: int) -> int:
"""求最小公倍数"""
return x * y // gcd(x, y)
4.极差、均值、方差、标准差、中位数
import math
def ptp(data):
"""求极差(全距)"""
return max(data) - min(data)
def average(data):
"""求均值"""
return sum(data) / len(data)
def variance(data):
"""求方差"""
x_bar = average(data)
temp = [(num - x_bar) ** 2 for num in data]
return sum(temp) / (len(temp) - 1)
def standard_deviation(data):
"""求标准差"""
return math.sqrt(variance(data))
def median(data):
"""找中位数"""
temp, size = sorted(data), len(data)
if size % 2 != 0:
return temp[size // 2]
else:
return average(temp[size // 2 - 1:size // 2 + 1])
- 点赞
- 收藏
- 关注作者
评论(0)