递归函数

递归

递归的定义

函数的递归调用:是函数嵌套调用的一种特殊形式
具体是指:在调用一个函数的过程中又直接或者间接地调用到本身

直接调用本身

直接调用本身
def f1():
    print('是我是我还是我')
    f1()
f1()

间接接调用本身

def f1():
    print('===>f1')
    f2()

def f2():
    print('===>f2')
    f1()

f1()

一段代码的循环运行的方案有两种
方式一:while、for循环

while True:
    print(1111)
    print(2222)
    print(3333)

方式二:递归的本质就是循环:

def f1():
    print(1111)
    print(2222)
    print(3333)
    f1()
f1()

需要强调的的一点是:

递归调用不应该无限地调用下去,必须在满足某种条件下结束递归调用

while n < 10:
    print(n)
    n+=1

def f1(n):
    if n == 10:
        return
    print(n)
    n+=1
    f1(n)

f1(0)

递归的两个阶段

回溯:一层一层调用下去
递推:满足某种结束条件,结束递归调用,然后一层一层返回

age(5) = age(4) + 10
age(4) = age(3) + 10
age(3) = age(2) + 10
age(2) = age(1) + 10
age(1) = 18

def age(n):
    if n == 1:
        return 18
    return age(n-1) + 10


res=age(5)
print(res)

递归的应用

l=[1,2,[3,[4,[5,[6,[7,[8,[9,10,11,[12,[13,]]]]]]]]]]

def f1(list1):
    for x in list1:
        if type(x) is list:
            # 如果是列表,应该再循环、再判断,即重新运行本身的代码
            f1(x)
        else:
            print(x)

f1(l)

二分法

算法:是高效解决问题的办法
算法之二分法
需求:有一个按照从小到大顺序排列的数字列表
需要从该数字列表中找到我们想要的那个一个数字
如何做更高效

nums=[-3,4,7,10,13,21,43,77,89]
find_num=10

nums=[-3,4,13,10,-2,7,89]
nums.sort()
print(nums)

方案一:整体遍历效率太低

for num in nums:
    if num == find_num:
        print('find it')
        break

方案二:二分法

def binary_search(find_num,列表):
    mid_val=找列表中间的值
    if find_num > mid_val:
        # 接下来的查找应该是在列表的右半部分
        列表=列表切片右半部分
        binary_search(find_num,列表)
    elif find_num < mid_val:
        # 接下来的查找应该是在列表的左半部分
        列表=列表切片左半部分
        binary_search(find_num,列表)
    else:
        print('find it')

nums=[-3,4,7,10,13,21,43,77,89]
find_num=8
def binary_search(find_num,l):
    print(l)
    if len(l) == 0:
        print('找的值不存在')
        return
    mid_index=len(l) // 2

    if find_num > l[mid_index]:
        # 接下来的查找应该是在列表的右半部分
        l=l[mid_index+1:]
        binary_search(find_num,l)
    elif find_num < l[mid_index]:
        # 接下来的查找应该是在列表的左半部分
        l=l[:mid_index]
        binary_search(find_num,l)
    else:
        print('find it')
binary_search(find_num,nums)

匿名函数

1、def用于定义有名函数

func=函数的内存地址
def func(x,y):
    return x+y
print(func)

2、lamdab用于定义匿名函数

print(lambda x,y:x+y)

3、调用匿名函数
方式一:

res=(lambda x,y:x+y)(1,2)
print(res)

方式二:

func=lambda x,y:x+y
res=func(1,2)
print(res)

4、匿名用于临时调用一次的场景:更多的是将匿名与其他函数配合使用

应用

需求:找出薪资最高的那个人

salaries={
    'siry':3000,
    'tom':7000,
    'lili':10000,
    'jack':2000
def func(k):
    return salaries[k]

========================max的应用
res=max(salaries,key=func) # 返回值=func('siry')
print(res)

res=max(salaries,key=lambda k:salaries[k])
print(res)

========================min的应用
res=min(salaries,key=lambda k:salaries[k])
print(res)

模块

1、什么是模块?
模块就是一系列功能的集合体,分为三大类
I:内置的模块
II:第三方的模块
III:自定义的模块
一个python文件本身就一个模块,文件名m.py,模块名叫m
ps:模块有四种形式
  1 使用python编写的.py文件
  2 已被编译为共享库或DLL的C或C++扩展
  3 把一系列模块组织到一起的文件夹(注:文件夹下有一个init.py文件,该文件夹称之为包)
  4 使用C编写并链接到python解释器的内置模块
2、为何有用模块
I:内置与第三的模块拿来就用,无需定义,这种拿来主义,可以极大地提升自己的开发效率
II:自定义的模块
可以将程序的各部分功能提取出来放到一模块中为大家共享使用
好处是减少了代码冗余,程序组织结构更加清晰

3、如何用模块
'''
y=333
z=444
import foo

 1、首次导入模块会发生3件事
 1、执行foo.py
2、产生foo.py的名称空间,将foo.py运行过程中产生的名字都丢到foo的名称空间中
 3、在当前文件中产生的有一个名字foo,该名字指向2中产生的名称空间
 之后的导入,都是直接引用首次导入产生的foo.py名称空间,不会重复执行代码

import foo
import foo
import foo
import foo

2、引用:

print(foo.x)
print(foo.get)
print(foo.change)

 强调1:模块名.名字,是指名道姓地问某一个模块要名字对应的值,不会与当前名称空间中的名字发生冲突

x=1111111111111
print(x)
print(foo.x)

 强调2:无论是查看还是修改操作的都是模块本身,与调用位置无关

import foo
x=3333333333
foo.get()
foo.change()
print(x)
print(foo.x)
foo.get()

3、可以以逗号为分隔符在一行导入多个模块
 建议如下所示导入多个模块

import time
import foo
import m

 不建议在一行同时导入多个模块

import time,foo,m

 4、导入模块的规范
I. python内置模块
II. 第三方模块
III. 程序员自定义模块
 import time
 import sys
 import 第三方1
 import 第三方2
 import 自定义模块1
 import 自定义模块2
 import 自定义模块3
 5、import 。。。 as 。。。

import foo as f # f=foo
f.get()
import abcdefgadfadfas
abcdefgadfadfas.f1
abcdefgadfadfas.f2
abcdefgadfadfas.f3
import abcdefgadfadfas as mmm
mmm.f1
mmm.f2
mmm.f3

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,012评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,628评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,653评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,485评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,574评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,590评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,596评论 3 414
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,340评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,794评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,102评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,276评论 1 344
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,940评论 5 339
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,583评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,201评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,441评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,173评论 2 366
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,136评论 2 352