Posted by Shen's Blog on Monday, January 1, 0001

2.函数和库

函数

问题:1.求阶乘$\begin{aligned}n!\end{aligned}$

def fac(n):                        # 求阶乘
    if n == 1:                     # 收敛条件
        return 1
    else:
        return n * fac(n - 1)      # 递归引用本函数的函数名
fac(5)

上述函数的bug(0的阶乘)

使用循环的方式求阶乘

def fac_loop(n):
    ret = 1
    for i in range(n):
        ret = ret * (i + 1)
    return ret
print(fac_loop(5))
print(fac_loop(0))
print(fac_loop(1))

求组合数$\begin{aligned}{n\choose k}=\frac{n!}{(n-k)!k!}\end{aligned} $

def combination(n, k):             # 求组合数
    return fac(n) / (fac(n - k) * fac(k))
combination(52, 4)

函数的类型

type(fac)  # function

函数的类型是参数类型到返回值类型两个类型集合的映射关系

max([23, 37, 13, 47]) # 输入类型是一个list,输出类型是一个数值

方法

pl = [23, 37, 13, 47]
pl.sort()              # 输入类型是一个list,输出类型是一个list,类型实例和函数名之间用一个.连接
pl

help(list.sort)        # 获得在线帮助

pl.sort(reverse=True) # 命名参数
pl

help(list)             # 列出list的全部方法

问题:伟人排序

姓名 出生年 寿命
buddha 佛陀 480BC 80
confucius 孔子 551BC 73
plato 柏拉图 428BC 80
zoroaster 琐罗亚斯德 500BC ?
# 新数据类型:dict
great = [{'name':'Buddha', 'birth':-480, 'age':80}, 
         {'name':'Confucius', 'birth':-551, 'age':73}, 
         {'name':'Plato', 'birth':-428, 'age':80}, 
         {'name':'Zoroaster', 'birth':-500, 'age':float('nan')}]
great[0]['name'] # 'Buddha'
great[1]['age']  # dict本身可以是list的元素  73

匿名函数

great = [{'name':'Buddha', 'birth':-480, 'age':80}, 
         {'name':'Confucius', 'birth':-551, 'age':73}, 
         {'name':'Plato', 'birth':-428, 'age':80}, 
         {'name':'Zoroaster', 'birth':-500, 'age':float('nan')}]
great.sort(key=lambda person: person['age'], reverse=True) # key 参数要求一个函数类型,lambda在这里非常方便
great

运行结果如下:

[{'name': 'Buddha', 'birth': -480, 'age': 80},
 {'name': 'Plato', 'birth': -428, 'age': 80},
 {'name': 'Confucius', 'birth': -551, 'age': 73},
 {'name': 'Zoroaster', 'birth': -500, 'age': nan}]
great = [{'name':'Buddha', 'birth':-480, 'age':80}, 
        {'name':'Confucius', 'birth':-551, 'age':73}, 
        {'name':'Plato', 'birth':-428, 'age':80}, 
        {'name':'Zoroaster', 'birth':-500, 'age':float('nan')}]
great.sort(key=lambda o: o['birth'])
great

运行结果如下:

[{'name': 'Confucius', 'birth': -551, 'age': 73},
 {'name': 'Zoroaster', 'birth': -500, 'age': nan},
 {'name': 'Buddha', 'birth': -480, 'age': 80},
 {'name': 'Plato', 'birth': -428, 'age': 80}]

库的安装和引用

pip3 install algorithms
python3 -c 'from algorithms.sort import merge_sort'
from algorithms.sort import merge_sort
test_list = [1, 8, 3, 5, 6]
result_list = merge_sort(test_list)
result_list

库地址:

pypi