文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

【12】Python函数学习(中)

2023-01-31 01:33

关注

作用域、局部和全局变量

 

 

前向引用:

def test(name,age=18,*args,**kwargs):  
    print(name)
    print(age,args,kwargs)
    school("Test")   #程序执行从上到下的,这里的school还没定义,所以执行报错。
test('alex',age=20,flag="F",water=1.5)   

def school(source):
    print(source)

运行结果:

报错NameError: name 'school' is not defined

 

正确写法:

def test(name,age=18,*args,**kwargs):
    print(name)
    print(age,args,kwargs)
    school("Test")


def school(source):
    print(source)

test('alex',age=20,flag="F",water=1.5)

运行结果:

alex

20 () {'flag': 'F', 'water': 1.5}

Test

 

 

局部变量(只在函数里生效,这个函数就是这个变量的作用域)

def logers(name):
    print('before change:',name)
    name='ALEX'
    print('after change:',name)
    age=23


name='alex'
logers(name)
print(name)

print(age)  #这里报错,NameError: name 'age' is not defined,,age属于局部变量,只能在局部生效。

运行结果:

before change: alex

after change: ALEX

alex

 

 

全局变量(在顶层,第一级定义的变量都是全局变量)

school='Oldboy'   #顶层定义全局变量
def logers(name):
    school="Mage"  #局部变量
    print('before change:',name,school)
    name='ALEX'
    print('after change:',name)
    age=23

name='alex'
logers(name)
print(name)
#print(age)
print(school)

运行结果:

before change: alex Mage  #局部变量优先,虽然内部变了,但是全局变量还是没变。

after change: ALEX

alex

Oldboy  #全局变量

 

改全局变量

不要这么用1:

school='Oldboy'
def logers(name):
    global school  #我要把函数的全局变量改了
    school="Mage"
    print('before change:',name,school)
    name='ALEX'
    print('after change:',name)
    age=23

name='alex'
logers(name)
print(name)
#print(age)
print(school)

运行结果:

before change: alex Mage

after change: ALEX

alex

Mage

 

总结:

  1. 局部变量的作用域只在子程序(函数)中有效

    2、全局变量的作用域在整个程序

    3、全局变量配置在程序最顶层

    4、需要把全局变量改为局部变量那就用global 变量名(不要那么用)

     

    不要这么用2:(作死)

def student():
    global name  #这个作用是把 name定义为全局变量
    name='alex'

student()
print(name)

 

为啥:容易混乱程序(找bug找死你)

 

 

递归:(在函数内部可以调用自己)

1.必须要有明确的结束条件

2.每次进入更深一层的时候,问题规模应该比上一层要小

3.递归效率不高,递归层次过多会导致栈溢出。(在计算机中,函数调用是通过栈(stack)这种数据结构实现的,每当进入一个函数调用,栈就会加一层栈帧,每当函数返回,栈就会减少一层栈帧。由于栈的大小不是无限的,所以递归次数过多会导致栈溢出。)

 

def calc(n):   #程序开始,取calc实参
    print(n)  #打印判断结果
    if int(n/2) >0 : 
        return calc(int(n/2)) #递归
    print('>>>',n)
calc(10)

运行结果:

10

5

2

1

>>> 1

 

 

函数式编程介绍:

函数式编程是一种抽象程度很高的编程范式,纯粹的函数式编程语言的编写没有变量。因此,任意一个函数,只要输入确定的,输出就是确定的,这种纯函数我们称之为没有副作用。而允许使用变量的程序设计语言,由于函数内部的变量状态不确定,同样的输入,可能得到不同的输出,因此这种函数是有副作用的。

函数式编程的一个特点就是,允许把函数本身作为参数传入另一个函数,还允许返回一个函数。

Python对函数式编程提供部分支持,由于python允许使用变量,因此,python不是纯函数式编程语言。

想学函数式编程可以学lisp、hashshell、erlang

 

 

高阶函数:

变量可以指向函数,函数的参数能接收变量,那么一个函数就可以接收另一个函数作为参数,这种函数就叫做高阶函数。

def add(a,b,f):
    return f(a)+f(b)

res=add(3,-6,abs)  #abs 绝对值的意思
print(res)

结果:

9


阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯