(十)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")
相关文章
|
2天前
|
数据挖掘 数据处理 索引
python常用pandas函数nlargest / nsmallest及其手动实现
python常用pandas函数nlargest / nsmallest及其手动实现
17 0
|
14天前
|
Python
python函数的参数学习
学习Python函数参数涉及五个方面:1) 位置参数按顺序传递,如`func(1, 2, 3)`;2) 关键字参数通过名称传值,如`func(a=1, b=2, c=3)`;3) 默认参数设定默认值,如`func(a, b, c=0)`;4) 可变参数用*和**接收任意数量的位置和关键字参数,如`func(1, 2, 3, a=4, b=5, c=6)`;5) 参数组合结合不同类型的参数,如`func(1, 2, 3, a=4, b=5, c=6)`。
14 1
|
29天前
|
Python
Python函数使用(四)
Python函数使用(四)
61 0
|
7天前
|
Serverless 开发者 Python
《Python 简易速速上手小册》第3章:Python 的函数和模块(2024 最新版)
《Python 简易速速上手小册》第3章:Python 的函数和模块(2024 最新版)
40 1
|
7天前
|
索引 Python
Python高维变量选择:SCAD平滑剪切绝对偏差惩罚、Lasso惩罚函数比较
Python高维变量选择:SCAD平滑剪切绝对偏差惩罚、Lasso惩罚函数比较
10 0
|
9天前
|
Python
python学习-函数模块,数据结构,字符串和列表(下)
python学习-函数模块,数据结构,字符串和列表
49 0
|
9天前
05-python之函数-函数的定义/函数的参数/函数返回值/函数说明文档/函数的嵌套使用/函数变量的作用域
05-python之函数-函数的定义/函数的参数/函数返回值/函数说明文档/函数的嵌套使用/函数变量的作用域
|
10天前
|
Python
python学习10-函数
python学习10-函数
|
10天前
|
Python
python学习4-内置函数range()、循环结构、循环控制语句、else语句、嵌套循环
python学习4-内置函数range()、循环结构、循环控制语句、else语句、嵌套循环
|
13天前
|
测试技术 开发者 Python
Python中的装饰器:优雅而强大的函数修饰工具
在Python编程中,装饰器是一种强大的工具,用于修改函数或方法的行为。本文将深入探讨Python中装饰器的概念、用法和实际应用,以及如何利用装饰器实现代码的优雅和高效。