目录
问题:如何避免import重复执行原有模块的剔除函数的那块呢?
1.from module1(模块名) import f,sum(函数名)
一.定义:定义一个包=新建一个文件夹+__init__.py文件
2.from sound.effect import echo
from sound.effect.echo import a
三.优先从__init__.py文件里找导入的import模块
知识点1.global和nonlocal
一.定义
nonlocal 使内层函数直接使用外层函数定义的变量
按常理说,两函数定义的值不能相互使用。
- 全局变量是定义函数外的变量
- 函数内可直接访问全局变量
- 函数体内定义的为局部变量
a=0
def f():
for i in range(10):
a=a+i
print(a)
f()
报错原因:
a出现在函数体内,被视作是一个局部变量 但并未定义
局部变量a没有和“值”联系在一起 没有赋值!
a = 0
def f():
global a
a=0
for i in range(10):
a=a+i
f()
>>45
二.在函数体内改变全局变量的值,要使用global
- 再重新定义
- global 改变了全局变量的值,可以再函数外输出
a=0
def f():
global a
a=100
f()
print(a)
>>100
正误判断1
内层函数要使用外层函数定义的变量,一定要使用nonlocal(x)
访问也属于使用,但没有必要使用nonlocal
三.在global nonlocal 前不能访问a
后面说明了a是全局变量 于是就不能提前访问
1.nonlocal只在函数体内有效 不会影响到函数外变量的值
知识点2.lambda匿名函数
定义:不使用def定义函数的方法
- 没有函数名
- 参数不需要用小括号括起来
- lambda 表达式必须写在同一行
注释:lambda x:x**2等价于 def f(x): return x**2
def s(f,x,y):
return f(x)+f(y)
print(s(lambda x:x**2,3,-5))
知识点3.默认参数
1.形参在定义中被赋值了,才算有默认值
def f(name='lixiaoming')
2.带默认值的形参必须放在不带默认值的形参后面
带默认值的形参也可以不对它导入实参
def f(country,name='lixiaoming'):
print('name=%s,country=%s'%(name,country))
f('china')
>>name='lixiaoming',country='china'
3.关键词参数不要求实参位置与形参位置一致
1.写实参的时候指定了给哪个形参传递参数值
4.对于没有默认值的形参,函数调用时必须为其指定参数
5.允许位置参数放在不定长参数后面
但调用函数时一定要使用关键词参数给不定长后面的形参传递实参
知识点4.返回值
一.定义
1.return语句:函数的运算结果返回到调用函数的位置
二.return返回字符串、列表、元组等数据
def f():
return 1,2,3
i=f()
print(type(i))
print(i)
>> <class 'tuple'>
(1, 2, 3)
知识点5:__name__=='__main__'
一个模块就是一个py文件!!!!
一.import语句
1.定义:
module1中定义了一些函数,若module2中也想使用,则通过import将module1导入
此时module2可以使用module1的所有函数
2.🌰module1=love module2=main
love.py
def f():
print("l love you")
main.py
import love
love.f()
>>l love you
在main里面再调用module中的函数,module本身的函数中不需要写调用函数
二.print(__name__)
第一次直接调用输出:__main__
第二次引入模块后调用输出:love(import文件名)
三.重复调用module中函数
原因:love.py中就已经调用了f()函数 import导入时是原模原样的复刻love.py中的运行结果
问题:如何避免import重复执行原有模块的剔除函数的那块呢?
解决方法:if __name__=='__main__':
f()
如果是自己本身,name=main,执行以下调用
不是自己本身,name=module1,不再等于main,故不执行以下调用,在module2中就可以只提取想要的函数的值了
四.import语句一次可以导入多个模块
知识点6.from import
传统方法:import module1
module1.f
等价于
1.from module1(模块名) import f,sum(函数名)
只导入一个模块中的部分标识符可忽略模块直接访问函数 而不用再➕模块名.了
from love import f
f()
2.import module1 as a
定义:导入module1(love)模块 觉得module1名字太长可以起个别名(a)
import love as a
a.f()
fanjdjdhee函数名 太长 f代替
from love import fanjdjdhee as f
f()
3.from module1 import *
定义:导入一个模块的全部函数 同时后面也不需要再➕模块名.了
但如果提前module1 内定义了__all__=[”f1“] 即使+了*也只能输出f1
知识点7.包
一.定义:定义一个包=新建一个文件夹+__init__.py文件
1.在一个文件夹里再创建一个子文件夹,在里面+__init__.py形成子包
2.__init__.py一定会出现在包内 可以是一个空文件
导入sound包的effect子包的echo模块
二.两种方法导入包中的子包中的模块中的函数
1.import sound.effect.echo
若导入echo模块的a函数 则调用时需要指定完整名字:
>>sound.effect.echo.a(实参)
2.from sound.effect import echo
>>echo.a(实参)
或者
from sound.effect.echo import a
>>a(实参)
三.优先从__init__.py文件里找导入的import模块
知识点8.猴子补丁
一.定义
动态替换原有代码而不改变原代码
二.意义
一个包中有多个子包中的模块都导入了相同的函数1 但突然发现函数1有不完美的功能
一个一个改太麻烦 又不建议改掉源代码 此时就可以试着打补丁!
三.函数名1=函数名2
意思:以后再调用函数名1 执行的就是函数名2的函数了
def sum(*args):
print("函数被sum调用!")
def newsum(*args):
print("函数被newsum调用!")
print(args)
sum=newsum
sum(1,2,3)
>>print("函数被newsum调用!")
(1,2,3)
知识点9:递归函数
一.定义
在函数f中又调用函数f()自身
二.n!(n的阶乘)
return返回的一定是最靠近这次return的调用!!
def f(i):
print(i)
i-=1
if i<=1:
return 1
else:
r=f(i)
return r
r=f(3)
print(r)
>>3
2
1
运行流程:f(3)-print3-i=2-else-f(2)-print2-i-1-f(2)=return1-r=1-f(3)=return1-r=1-print1
- f(3)=3*f(2)
- f(2)=f(1)*2 f(3)=3*f(1)*2
- f(1)=1. f(3)=6
- r=6 print6
好恐怖www www!
def f(i):
if i<=1:
return 1
else:
return i*f(i-1)
r=f(3)
print(r)
这是一个超级简单的for循环也可以实现n的阶乘!
n=int(input('请输入n:'))
jiecheng=1
for i in range(1,n+1):
jiecheng=i*jiecheng
print(jiecheng)
正常的🧠
n=int(input('请输入n:'))
def f(n):
sum=1
for i in range(1,n+1):
sum=i*sum
return sum
r=f(n)
print(r)