(十)Python中的函数(下)

简介: 12.用递归函数计算阶乘

12.用递归函数计算阶乘

def fac(n):
    if n==0:
        return 1
    else:
      return n*fac(n-1)
print('Enter a positive integer:')
n = int(input())
y = fac(n)
print(y)

13.头递归和尾递归

头递归:在一般条件条件(如n==1)满足时,返回一个确定的值,而在其他情况下,返回一个包含本身函数的递归调用的这种递归设计。如下:

def factorial(int n):
    if n == 1:
        return 1
    else:
        return factorial(n - 1) * n

尾递归:每一次函数的递归调用都会将一个阶段性的结果传递到下一个被调用的函数中,当最终的一般条件(如这里的n==0)满足时,把最终结果直接返回。

def factorial(n,product):
    if n == 0:
        return product
    product = product * n
    return factorial(n - 1, product)

在头递归的实现中,我们在进行下一层的调用前,没有进行计算。在下一层返回后,我们才完成了这一层的计算。

image.png

在尾递归的实现中,我们在进行下一层的调用前,会先进行计算,而在最终一般条件满足时,会将计算的结果逐层直接返回。

image.png

学习递归的函数调用更多的是学习这种与数学归纳法有异曲同工之妙的思想。在遇到问题时,很多情况,我们可以把待问题逐层归约为更简单的问题。递归方式很直观情况下,再优先考虑递归。


14.Python中的迭代器

在python中,如果要访问一个对象中的每一个元素,可以:(以列表为例)

1. lst = ['j','i','s','u','a','n']
2. for i in lst:
3. print(i, end = ' ')

除此之外,还能这样:

1. lst = ['j','i','s','u','a','n']
2. lst_iter = iter(lst)
3. print(lst_iter.__next__())  # 输出 j
4. print(lst_iter.__next__())  # 输出 i
5. ...

iter函数是python中内建的系统函数之一——它的作用是返回一个迭代器对象。所有的迭代器对象,在python3中都有  _next_ 方法,其作用 是取得下一个元素。实际上,for循环的实现,就是通过迭代器来完成的。


15.函数作为参数传递

问题:对一列表的每个元素都进行三种运算,然后返回一个新的列表。三种运算如下:


(1)将列表中的每一个元素都求平方


(2)将列表中的每一个元素(数字)转换为字符串


(3)给每一个元素的值加上1


一般先想到的是写三个for循环,但是这些函数的逻辑其实可以分为两个部分:


A.遍历每一个元素,对每一个元素都进行某种操作(如下func_seq函数)


B.具体执行这种操作,也就是上面是那种运算其中之一

def func_seq(func,ls):
    return [func(i) for i in ls]
def sqrt(num):
    return num **2
def to_str(num):
    return str(num)
def plus(num):
    return num+1
ls = [11, 23, 33]
print(func_seq(sqrt,ls))
print(func_seq(to_str,ls))
print(func_seq(plus,ls))

结果为右

image.png

16.Python中的lambda函数  函数式编程是一种编程范式,跟【面向过程编程】和【面向对象编程】具有并列关系。

1. def func_seq(func, ls):
2. return [func(i) for i in ls]

上面就是我们刚才的func_seq,如果我们要进行的运算比较简单,再写一个函数就麻烦了,为此Python提供了一种特殊的函数 lambda 。


如果我们要定义一个函数:返回参数的值的平方:

sqrt= lambda x : x ** 2
print(sqrt(2))  #像调用普通函数一样调用它

C++11,JAVA 8 和C#3.0等。

在python中,lambda函数的正式定义如下:

lambda arg1, args, ... argN: expressions_with_args

可见lambda函数可以接受任意多个参数。如:

func = lambda x, y : x + y  # 返回 x + y 的值

注意:lambda包含的表达式不能超过一个——如果想定义更复杂的东西,最好还是定义一个普通函数。

17.map和reduce

考虑之前的这个代码:

1. def func_seq(func, ls):
2. return [func(i) for i in ls]

这个函数是对一个列表中的每一个元素应用func函数,然后用得到的新元素建立一个新的列表,并直接返回。而map函数其实和这个func_seq的作用是相同。


map语法如下:

map(function, iterable, ...)
# 第一个参数function表示一个函数
# iterable表示一个可迭代对象(如列表)

举例:有一个列表,并定义了一个返回一个数加1的函数:

1. ls = [11,22,33]
2. plus = lambda x : x + 1

在python 3 中,调用map函数时,我们会得到一个迭代器:

print(map(plus, ls))  # <map object at 0x000001BF7F46C6A0>

当我们需要使用map的结果时,我们可以直接用list函数将其转化为一个列表:

1. >>> list(map(plus, ls01))
2. [2, 2, 3, 4]

iterable后有几个省略号——map可使用的可迭代对象参数个数并不是只有一个。

>>> def abc(a, b, c):
...     return a * 10000 + b * 100 + c
...
>>> list1 = [11, 22, 33]
>>> list2 = [44, 55, 66]
>>> list3 = [77, 88, 99]
>>> list(map(abc, list1, list2, list3))
[114477, 225588, 336699]

当function的参数不止一个时,map函数将会从后面的可迭代对象里一次选取相同下标的元素,然后“并行”应用于函数function。这里的“并行”是python官方文档原文的直译。


map的function也可以使None——这时函数的作用就是把多个列表相同位置的元素归并到一个元组,如下:

>>> list1 = [11, 22, 33]
>>> list2 = [44, 55, 66]
>>> list3 = [77, 88, 99]
>>> list(map(None, list1, list2, list3))
[(11, 44, 77), (22, 55, 88), (33, 66, 99)]

还有一个类似map的函数reduce——也有两个参数:一个函数f,一个list,但行为和map()不同,reduce()传入的函数f必须接受两个参数,reduce()对list()的每个元素反复调用函数f,并返回最终结果值。如求和函数f:

def f(a, b):
    return a + b

reduce(f,[1,3,5,7,9]) 将以此执行以下计算:


(1)先计算2个元素:f(1,3) ,结果为4


(2)把结果和第3个元素计算:f(4,5) ,结果为9


(3)以此类推——f(9,7),结果为16


(4)f(16,9),结果为25


(5)所有元素都用过了,计算结束,返回结果25


18.汉诺塔问题

image.png


image.png

def hannuo(n,t1,t2,t3):
    if n==1:
        s = "-->"
        seq = (t1,t3)
        f= s.join(seq)
        print (f)
        return
    hannuo(n-1,t1,t3,t2)
    hannuo(1,t1,t2,t3)
    hannuo(n-1,t2,t1,t3)
n = int(input())
hannuo(n,"A","B","C")
相关文章
|
3月前
|
存储 JavaScript Java
(Python基础)新时代语言!一起学习Python吧!(四):dict字典和set类型;切片类型、列表生成式;map和reduce迭代器;filter过滤函数、sorted排序函数;lambda函数
dict字典 Python内置了字典:dict的支持,dict全称dictionary,在其他语言中也称为map,使用键-值(key-value)存储,具有极快的查找速度。 我们可以通过声明JS对象一样的方式声明dict
293 1
|
3月前
|
算法 Java Docker
(Python基础)新时代语言!一起学习Python吧!(三):IF条件判断和match匹配;Python中的循环:for...in、while循环;循环操作关键字;Python函数使用方法
IF 条件判断 使用if语句,对条件进行判断 true则执行代码块缩进语句 false则不执行代码块缩进语句,如果有else 或 elif 则进入相应的规则中执行
368 1
|
3月前
|
Java 数据处理 索引
(numpy)Python做数据处理必备框架!(二):ndarray切片的使用与运算;常见的ndarray函数:平方根、正余弦、自然对数、指数、幂等运算;统计函数:方差、均值、极差;比较函数...
ndarray切片 索引从0开始 索引/切片类型 描述/用法 基本索引 通过整数索引直接访问元素。 行/列切片 使用冒号:切片语法选择行或列的子集 连续切片 从起始索引到结束索引按步长切片 使用slice函数 通过slice(start,stop,strp)定义切片规则 布尔索引 通过布尔条件筛选满足条件的元素。支持逻辑运算符 &、|。
219 0
|
4月前
|
设计模式 缓存 监控
Python装饰器:优雅增强函数功能
Python装饰器:优雅增强函数功能
296 101
|
4月前
|
缓存 测试技术 Python
Python装饰器:优雅地增强函数功能
Python装饰器:优雅地增强函数功能
241 99
|
4月前
|
存储 缓存 测试技术
Python装饰器:优雅地增强函数功能
Python装饰器:优雅地增强函数功能
214 98
|
4月前
|
缓存 Python
Python中的装饰器:优雅地增强函数功能
Python中的装饰器:优雅地增强函数功能
|
5月前
|
Python
Python 函数定义
Python 函数定义
628 155
|
6月前
|
PHP Python
Python format()函数高级字符串格式化详解
在 Python 中,字符串格式化是一个重要的主题,format() 函数作为一种灵活且强大的字符串格式化方法,被广泛应用。format() 函数不仅能实现基本的插入变量,还支持更多高级的格式化功能,包括数字格式、对齐、填充、日期时间格式、嵌套字段等。 今天我们将深入解析 format() 函数的高级用法,帮助你在实际编程中更高效地处理字符串格式化。
633 0
|
4月前
|
算法 安全 数据安全/隐私保护
Python随机数函数全解析:5个核心工具的实战指南
Python的random模块不仅包含基础的随机数生成函数,还提供了如randint()、choice()、shuffle()和sample()等实用工具,适用于游戏开发、密码学、统计模拟等多个领域。本文深入解析这些函数的用法、底层原理及最佳实践,帮助开发者高效利用随机数,提升代码质量与安全性。
920 0

推荐镜像

更多