局部变量与全局变量

全局变量:全局生效的变量,在顶头的,无缩进的定义的变量。

局部变量:函数内生效的变量,在函数内定义的变量。

  1. name='1fh'
  2. def changename():
  3. name='sb'
  4. print('shi',name)
  5. changename()
  6. print(name)

函数里的局部变量无法改变修改全局变量

而global可以使函数内出现的函数名变成全局变量处理

那个局部变量可以读取可以赋值

  1. name='1fh'
  2. def changename():
  3. global name
  4. name='sb'
  5. print('shi',name)
  6. changename()
  7. print(name)

一般全局变量大写,局部变量小写。

指定上一级的变量nonlocal

  1. def xiba():
  2. name = 'shit'
  3. print(name)
  4. def xiba1():
  5. nonlocal name
  6. name = 'abcd'
  7. xiba1()
  8. print(name)
  9. xiba()

前向引用:

如果执行一个函数时里面要调用另外一个函数,而另外一个函数在调用函数的后面才

定义,这种情况会出现报错

错误示例

  1. def foo():
  2. print('from foo')
  3. bar()
  4. foo()
  5. def bar():
  6. print('from bar')

递归:一层一层往下,在函数内部,不断调用自己,死循环会报错,要有结束条件

  1. def calc(n):
  2. print(n)
  3. if int(n/2) ==0:
  4. return n
  5. return calc(int(n/2)) #不断调用自己
  6. calc(10)

递归加强版

  1. person_list=['alex','wupeiqi','yuanhao','linhaifeng','sb','sb1']
  2. def ask_way(person_list):
  3. answer1='没有人知道位置'
  4. answer2 = '知道位置'
  5. if len(person_list) == 0:
  6. return answer1
  7. person = person_list.pop(0) # pop是删除第一个位置的元素,并取得这个元素的值
  8. print(person)
  9. if person =='linhaifeng':
  10. return answer2
  11. else:
  12. print('this man dont know the way',person)
  13. return ask_way(person_list) #注意递归的语句要前面要加上return,否则返回值会变成none出错
  14. abcd=ask_way(person_list)
  15. print(abcd)

作用域:函数的执行与进行def定义的那段有关,与在哪调用无关

这里返回的函数名的意思是返回这个函数名所占用的内存地址

  1. def test1():
  2. print('in the test1')
  3. return test1
  4. res= test1()
  5. print(res)

作用域示例:

  1. name = 'alex'
  2. def foo():
  3. name = 'lhf'
  4. def bar():
  5. name='abcd'
  6. print(name)
  7. bar() #这个bar可以成功调用,因为她与def bar同级
  8. foo()
  9. bar() #这个bar不能成功调用会报错,因为它是def bar的上一级

针对报错的问题,可以将bar函数的内存地址弄出来,然后直接对内存地址进行调用

  1. name = 'alex'
  2. def foo():
  3. name = 'lhf'
  4. def bar():
  5. name='abcd'
  6. print(name)
  7. return foo #注意这个return是bar的返回值
  8. return bar #注意这个return是foo的返回值
  9. resbar=foo()
  10. resbar()
  11. sb= resbar()
  12. print(sb)

匿名函数

1定义方法:

使用lambda定义。lambda 形参名:处理的方法
lambda可以随便赋予名字,平常不占用内存
比如以下这段函数

  1. def calc(x):
  2. return x+1
  3. res = calc(10)
  4. print(res)

等同于

  1. func=lambda x:x+1
  2. print(func(10))

比如下面这段函数

  1. name = 'alex'
  2. def changename(x):
  3. return name+'sb'
  4. res=changename('alex')
  5. print(res)

等同于

  1. name=input('press the name')
  2. res=lambda x:str(name)+'sb'
  3. print(res(name))

可以包含多个形参

  1. func=lambda x,y,z:(x+1,y+1,z+1)
  2. print(func(1,3,4))

Py变量,递归,作用域,匿名函数的更多相关文章

  1. Python第七天 函数 函数参数 函数里的变量 函数返回值 多类型传值 函数递归调用 匿名函数 内置函数

    Python第七天   函数  函数参数   函数里的变量   函数返回值  多类型传值     函数递归调用   匿名函数   内置函数 目录 Pycharm使用技巧(转载) Python第一天   ...

  2. day03 函数基本语法及特性 2. 参数与局部变量 3. 返回值 嵌套函数 4.递归 5.匿名函数 6.函数式编程介绍 7.高阶函数 8.内置函数

    本节内容 1. 函数基本语法及特性 2. 参数与局部变量 3. 返回值 嵌套函数 4.递归 5.匿名函数 6.函数式编程介绍 7.高阶函数 8.内置函数 温故知新 1. 集合 主要作用: 去重 关系测 ...

  3. python之三元表达式、列表推导、生成器表达式、递归、匿名函数、内置函数

    目录 一 三元表达式 二 列表推到 三 生成器表达式 四 递归 五 匿名函数 六 内置函数 一.三元表达式 def max(x,y): return x if x>y else y print( ...

  4. Python之函数的递归、匿名函数、内置函数

    一.函数的递归 ''' 1 什么是函数递归 函数递归调用(是一种特殊的嵌套调用):在调用一个函数的过程中,又直接或间接地调用了该函数本身 递归必须要有两个明确的阶段: 递推:一层一层递归调用下去,强调 ...

  5. python 三元表达式、列表推导式、生成器表达式、递归、匿名函数、内置函数

    http://www.cnblogs.com/linhaifeng/articles/7580830.html 三元表达式.列表推导式.生成器表达式.递归.匿名函数.内置函数

  6. python3 速查参考- python基础 6 -> 函数编程之参数、变量、作用域、递归、匿名函数 lambda

    函数基础 1. 速查笔记 #-- 函数相关的语句和表达式 myfunc('spam') # 函数调用 def myfunc(): # 函数定义 return None # 函数返回值 global a ...

  7. python开发基础04-函数、递归、匿名函数、高阶函数、装饰器

    匿名函数 lamba lambda x,y,z=1:x+y+z 匿名就是没有名字 def func(x,y,z=1): return x+y+z 匿名 lambda x,y,z=1:x+y+z #与函 ...

  8. python 三元运算符、推导式、递归、匿名函数、内置函数

    三目运算符 # 三目(元)运算符:就是 if...else...语法糖 # 前提:简化if...else...结构,且两个分支有且只有一条语句 # 注:三元运算符的结果不一定要与条件直接性关系 cmd ...

  9. Python day5 --------递归、匿名函数、高阶函数、内置函数

    一.递归 在函数内部,可以调用其他函数.如果一个函数在内部调用自身本身,这个函数就是递归函数. 递归要求: 1. 必须有一个明确的结束条件 2. 每次进入更深一层递归时,问题规模相比上次递归都应有所减 ...

  10. python协程函数、递归、匿名函数与内置函数使用、模块与包

    目录: 协程函数(yield生成器用法二) 面向过程编程 递归 匿名函数与内置函数的使用 模块 包 常用标准模块之re(正则表达式) 一.协程函数(yield生成器用法二) 1.生成器的语句形式 a. ...

随机推荐

  1. Ribbon提供的负载均衡算法IRule(四)

    一.Ribbon算法的介绍 Ribbon的源码地址:https://github.com/Netflix/ribbon IRule:根据特定算法中从服务器列表中选取一个要访问的服务,Ribbon默认的 ...

  2. CVE-2019-0708_RDP漏洞利用

    可以说是2019年影响比较大的一个漏洞了, 简述下这个漏洞: Windows系列服务器于2019年5月15号,被爆出高危漏洞,该漏洞影响范围较广如: windows2003.windows2008.w ...

  3. xss靶场练习(7.22)

    靶场地址:http://xss.fbisb.com/ 参考的文章:https://www.cnblogs.com/cute-puli/p/10834954.html  感谢大佬的分享 做这个题的思路就 ...

  4. C#未能找到路径“\bin\roslyn\csc.exe”的一部分。

    主要原因是因为两个库存在,需要生成一个 roslyn文件,但是这个项目是从 vs2017中,打开的,所以,没有必要存在它. 那么就删除这两个关联的库,就可以达到目的 S2017 打开  程序包管理控制 ...

  5. Java学习_反射

    什么是反射? 反射就是Reflection,Java的反射是指程序在运行期可以拿到一个对象的所有信息. 反射是为了解决在运行期,对某个实例一无所知的情况下,如何调用其方法. JAVA反射机制是在运行状 ...

  6. MySQL求两表的差集(非交集)

    mysql如何查询两个字段数不同的表中数据不一致的记录 一般可用NOT EXISTS(非存在子句)或 LEFT JOIN左(右)连接后所产生空字段值来筛选两表的差集 1.NOT EXISTS not ...

  7. kill的使用

    Linux中Kill进程的N种方法 (2011-12-23 17:27:59) 转载▼ 标签: 杂谈 分类: ubuntu系统操作 常规篇: 首先,用ps查看进程,方法如下: $ ps -ef -- ...

  8. Socket.io详解

    socket.io是一个跨浏览器支持WebSocket的实时通讯的JS. http://socket.io/docs/ 由于HTTP是无状态的协议,要实现即时通讯非常困难.因为当对方发送一条消息时,服 ...

  9. C#设计模式——建造者模式(Builder Pattern)

    1.建造者模式简介 1.1>.定义 建造者模式(Builder)将复杂的构建与其表示相分离,使得同样的构建过程可以创建不同的表示. 1.2>.使用频率  中低 1.3>.原型模式应用 ...

  10. eclipse中安装jetty插件并使用

    一.eclipse中jetty插件安装: 打开eclipse,依次点击菜单Help->Eclipse Marketplace,在Find后面的框中输入jetty,选择第一项进行install即可 ...