python的入门学习-global和nonlocal,lambda匿名函数,默认参数,返回值,import,递归函数,n的阶乘

目录

知识点1.global和nonlocal

一.定义

二.在函数体内改变全局变量的值,要使用global

三.在global nonlocal 前不能访问a

知识点2.lambda匿名函数

知识点3.默认参数

1.形参在定义中被赋值了,才算有默认值

2.带默认值的形参必须放在不带默认值的形参后面

3.关键词参数不要求实参位置与形参位置一致

4.对于没有默认值的形参,函数调用时必须为其指定参数

5.允许位置参数放在不定长参数后面

知识点4.返回值

一.定义

二.return返回字符串、列表、元组等数据

知识点5:__name__=='__main__'

一.import语句

1.定义:

2.🌰module1=love   module2=main

三.重复调用module中函数

问题:如何避免import重复执行原有模块的剔除函数的那块呢?

解决方法:if __name__=='__main__':

四.import语句一次可以导入多个模块

知识点6.from import

1.from module1(模块名) import f,sum(函数名)

2.import module1 as a

3.from module1 import *

知识点7.包

一.定义:定义一个包=新建一个文件夹+__init__.py文件

二.两种方法导入包中的子包中的模块中的函数

1.import sound.effect.echo

>>sound.effect.echo.a(实参)

2.from sound.effect import echo

>>echo.a(实参)

from sound.effect.echo import a

>>a(实参)

三.优先从__init__.py文件里找导入的import模块

知识点8.猴子补丁

一.定义

二.意义

知识点9:递归函数

一.定义

二.n!(n的阶乘)

这是一个超级简单的for循环也可以实现n的阶乘!


知识点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)

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值