python 函数递归,三元表达式解读,匿名一次性函数,模块略解
跟我一起从0开始入门python吧。双连怪。
一.函数的递归调用
引入
函数的递归调用:就是在调用一个函数的过程种又直接或者间接的把自己给调用了
# 示例1:直接调用自己
def foo():
print('hello')
foo()
foo()
# 示例2:间接调用自己
def bar():
print('from bar')
foo()
def foo():
print('hello')
bar()
foo()
通常我们把这样没有条件判断退出的的递归称之为死递归。
-
为何死递归会抛出异常???
-
应为无限的递归会导致内存溢出,所以python设定了最大的递归层数
import sys #我们可以调用sys函数去看看。 print(sys.getrecursionlimit()) #最大递归次数为1000 print(sys.setrecursionlimit(2000))#我们可以如此修改递归次数
-
所以:不应该无限递归调用下去,应该在满足某种条件下结束递归调用,然后返回
递归调用应该分为两个阶段
- 1、回溯(挖井) :一层一层地递归调用下去
- 2、递推(从井里往外跳):在满足某一条件的情况下结束回溯,然后开始向上一层层返回
'''
思路
salary(5) = salary(4) + 10
salary(4) = salary(3) + 10
salary(3) = salary(2) + 10
salary(2) = salary(1) + 10
salary(1) = 18
n=1 salary(n) = 18
n!=1 salary(n) = salary(n-1) + 10
'''
def salary(n):
if n == 1:
return 18
return salary(n-1) + 10
res=salary(5)
print(res)
案例一:
#取出列表中的所有数值
nums=[111,[222,[333,[444,[5555,[6666,[777,[888,[9999]]]]]]]]]
def func(l):
for x in l:
if type(x) is list:
# 把自身的代码重新再调用一次
func(x)
else:
print(x)
func(nums)
结果:
111
222
333
444
5555
6666
777
888
9999
案例二:
nums = [11, 13, 32, 47, 53, 73, 84, 91]
def xun(l,find):
a=len(l)//2
if len(l)==0:
print('数值不存在')
return
if find>l[a]:
b=l[a+1:]
xun(b,find)
elif find<l[a]:
c=l[:a]
xun(c,find)
else:
print('数值存在')
xun(nums,54)
结果:
数值不存在
二.三元表达式
三元表达式: 表达式1 if 条件 else 表达式2
'''
未使用三元表达式之前
def max2(x,y):
if x > y:
return x
else:
return y
'''
x=111
y=222
#三元表达式使用之后
res=x if x > y else y
# 元 元 元
print(res)
三.匿名函数
- 匿名函数即没有名字的函数
- 特点:没有名字意味着只能用一次,用完之后就是垃圾,所以匿名函数只用于临时使用一次的场景
- 示例
a={'沙雕英雄传':55,'青青大草原':36,'爱情36集':108}
'''
我们将这一段,简化成下面key=lambda k:salaries[k]
def func(k):
return salaries[k]
'''
print(max(a,key=lambda k:a[k]))
print(min(a,key=lambda k:a[k]))
print(sorted(a,key=lambda k:a[k]))#reverse是反转的意思,在sorted中默认是False
#如果是False 的话那么就是从小到大
print(sorted(a,key=lambda k:a[k],reverse=True))#如果是True 那么就是反转过来了
#那么就是从小到大
结果:
爱情36集
青青大草原
['青青大草原', '沙雕英雄传', '爱情36集']
['爱情36集', '沙雕英雄传', '青青大草原']
四.模块
什么是模块
- 模块就是一个功能的集合体,不是用来直接运行,而是用来被导入使用的
模块分为三大来源:
- 1、内置的模块
- 2、第三方模块
- 3、自定义的模块
模块分为四种类别:
- 1、一个py文件就是一个模块
- 2、一个文件夹也是一个模块=》包
- 3、已被编译为共享库或DLL的C或C++扩展
- 4 使用C编写并链接到python解释器的内置模块
为何要用模块
- 使用别人的模块:
- 1、拿来主义,提升开发效率
- 自定义模块:
- 1、别人的功能不够用了,需要自己的去编写
- 2、解决代码冗余
- 3、如何用模块
我们假设现在有一个spam.py文件里面有多个我们需要用到的函数
文件如下:
# spam.py
print('from the spam.py')
money = 1000
def read1():
print('spam模块:', money)
def read2():
print('spam模块')
read1()
def change():
global money
money = 0
我们先来使用一下:
import spam
spam.read1()
我们可以发现我们在调用模块的时候会首先声明一句
import spam
因为我们需要地址信息,不然我们执行文件的时候,不知道这个函数在哪里
文件名是spam.py,模块名则是spam
# 首次导入模块发生的事情
# 1、触发被导入的模块的运行,产生一个模块的名称空间,把模块中的名字都丢进去
# 2、会在当前执行文件中得到一个名字spam,该名字是指向被导入模块的名称空间的
# 之后的导入,名字spam直接引用首次导入产生的名称空间,不会再执行模块的内的代码了
#所以多个 是只执行一个的
import spam
import spam
import spam
如果我们的模块有多个我们也可以使用一行import 来导入多个
但是我们不推荐这种用法
# 一行导入多个模块
import spam,m1,m2,m3 # 不推荐
我们还可以为导入的模块起一个别名
# 为导入的模块起别名
import spam as sm
努力学习!