当前位置: 首页 > news >正文

python 的函数、值传递、和作用域(例子)

1.python的函数格式

        def FuncName([arg1,arg2,..]):
                func_suite

        def: def是函数的关键字
        FuncName: 实际也是变量,它指向函数对象,在函数定义时被赋值,根据习惯,这里我们成为函数名
        ():()是函数运算符,引用函数时,用函数名+()引用,如: FuncName()
        [arg1,arg2,..]: 这个是函数体的参数,当为空时,我们称这个函数为无参函数,相对应的就是有参函数,python的参数传递很强大,可以是位置参数一一对应,也可以默认参数赋值,还可以传递字典等
        ":" : python的语句都必须以 : 结尾
        func_suite: 这个是函数体的内容,可以用"pass"进行占位,还可以嵌套函数等

需要注意的是,每个函数结束后都必须返回值,如果没有用return关键字明确指明,那么默认返回None

例子:

In [2]: def hello():
...: print "hello"
...:

In [3]: a=hello()
hello

In [4]: print a
None

2.参数传递

<1>普通的从左往右匹配的参数传递

 def f1(x,y):
     print "x:%d y:%d" %(x,y)

In [38]: m=1

In [39]: n=2

In [40]: f1(m,n)
x:1 y:2

In [41]: f1(n,m)
x:2 y:1

这种方式传参个数必须匹配,否则报错

<2>设置默认参数

In [42]: def f2(x=1,y):
    ...:     print "x:%d y:%d" %(x,y)
  File "<ipython-input-42-52965f3ab864>", line 1
    def f2(x=1,y):
SyntaxError: non-default argument follows default argument

In [43]: def f2(y,x=1):
    ...:     print "x:%d y:%d" %(x,y)
In [45]: n=99

In [46]: m=6

In [47]: f2(n)
x:1 y:99

In [48]: f2(n,m)
x:6 y:99

(1)默认参数要写在位置参数后面,否则报错
(2)传递参数时,可以不传递默认有值的参数,但是当传递了对应参数,默认值会被覆盖掉

<3>1个'*',传递任意个数参数(非键值对),函数收集为列表

In [53]: def f3(x,*y):
...:     print x,y
...:       

In [54]: n=1;m=2

In [55]: f3(n,m,4,5,6)
1 (2, 4, 5, 6)

带*的参数也要放在位置参数后面,位置参数匹配完后,剩下的才会收集为列表并赋值给y这个变量

<4>2个'*',传递任意个键值对参数,收集为字典

In [85]: def f4(x,**y):
    ...:     print x,y
    ...:     

In [86]: f4(1,n=2,a=4,b=2)
1 {'a': 4, 'b': 2, 'n': 2}

3.python的作用域(LEGB),参考:https://segmentfault.com/a/1190000000640834
简而言之,LEGB 代表名字查找顺序: locals -> enclosing function -> globals -> builtins

    locals 是函数内的名字空间,包括局部变量和形参
    enclosing 外部嵌套函数的名字空间(闭包中常见)
    globals 全局变量,函数定义所在模块的名字空间
    builtins 内置模块的名字空间

所以,在 Python 中检索一个变量的时候,优先回到 locals 里面来检索,检索不到的情况下会检索 enclosing ,enclosing 没有则到 globals 全局变量里面检索,最后是到 builtins 里面来检索。

例子:

[root@cqhdtest python_learn]# ./getvalue.py 
Ex Gy Ez
Lx Gy Ez
[root@cqhdtest python_learn]# cat getvalue.py 
#!/usr/local/anaconda2/bin/python
x='Gx'
y='Gy'
z='Gz'
def f1(x,y,z):
    x='Ex'
    z='Ez'
    print x,y,z
    def f2(x,y,z):
    x='Lx'
    print x,y,z
    f2(x,y,z)
f1(x,y,z)

当调用f1函数时,此时f1中的print语句会去寻找x,y,z变量的值,它从当前作用域开始找,x,z都在本域有值,所以x='Ex',z='Ez',y没有值,所以它向外去globals作用域找,发现y='Gy',所以第一行输出为"Ex Gy Ez",程序继续执行,调用f2函数,f2的print也查找x,y,z的变量的值,首先在local域找,发现x="Lx",y在local找不到,于是去enclosing域找,发现也没有,于是找Global域,所以y='Gy',z同理,在enclosing域找到了,便停止搜索,于是z='Ez',所以第二行输出为"Lx Gy Ez"

如果我们想在函数内对全局变量进行修改,则可以使用global关键字

    global:告诉函数,使用全局变量作为当前变量

例子:

[root@cqhdtest python_learn]# ./global.py 
Gx
Ex
[root@cqhdtest python_learn]# cat global.py 
#!/usr/local/anaconda2/bin/python
x='Gx'
def f1():
    x='Ex'
def f2():
    global x
    x='Ex'
f1()
print x
f2()
print x

函数f1中的x是本地变量,当f1执行完后x的值也被销毁
函数f2中的x使用全局变量,所以当x被改变后,print的值也变了

转载于:https://blog.51cto.com/linzb/2089011

相关文章:

  • python中的str.strip()的用法
  • 旅行计划(题解)
  • 用jQuery怎么做到前后端分离
  • 第三次冲刺
  • WPF自学入门(九)WPF自定义窗口基类
  • mongodb的数据库操作
  • php转义之gpc
  • 软件工程网络15结对编程作业
  • FZU OJ:2230 翻翻棋
  • 说说网络通信模型
  • Rust 和Erlang的对比
  • 继续吐槽在net下没有合适的Disk Cache之使用EhCache
  • 默认形参值
  • 第39级台阶 每步1个或2个台阶 有多少种上法
  • 元素拖放
  • 分享一款快速APP功能测试工具
  • [ 一起学React系列 -- 8 ] React中的文件上传
  • 【干货分享】SpringCloud微服务架构分布式组件如何共享session对象
  • 【跃迁之路】【641天】程序员高效学习方法论探索系列(实验阶段398-2018.11.14)...
  • Centos6.8 使用rpm安装mysql5.7
  • css的样式优先级
  • ECMAScript 6 学习之路 ( 四 ) String 字符串扩展
  • ES6 ...操作符
  • JavaScript HTML DOM
  • JavaScript 基础知识 - 入门篇(一)
  • java多线程
  • Python中eval与exec的使用及区别
  • Rancher如何对接Ceph-RBD块存储
  • Storybook 5.0正式发布:有史以来变化最大的版本\n
  • yii2权限控制rbac之rule详细讲解
  • Yii源码解读-服务定位器(Service Locator)
  • zookeeper系列(七)实战分布式命名服务
  • 分享几个不错的工具
  • 干货 | 以太坊Mist负责人教你建立无服务器应用
  • 前端
  • 新手搭建网站的主要流程
  • 一个JAVA程序员成长之路分享
  • 【运维趟坑回忆录 开篇】初入初创, 一脸懵
  • 第二十章:异步和文件I/O.(二十三)
  • 数据库巡检项
  • 小白应该如何快速入门阿里云服务器,新手使用ECS的方法 ...
  • # Apache SeaTunnel 究竟是什么?
  • (2)Java 简介
  • (JSP)EL——优化登录界面,获取对象,获取数据
  • (NO.00004)iOS实现打砖块游戏(九):游戏中小球与反弹棒的碰撞
  • (附源码)python房屋租赁管理系统 毕业设计 745613
  • (附源码)springboot青少年公共卫生教育平台 毕业设计 643214
  • (附源码)ssm经济信息门户网站 毕业设计 141634
  • (十六)Flask之蓝图
  • (译) 理解 Elixir 中的宏 Macro, 第四部分:深入化
  • (转载)Linux 多线程条件变量同步
  • .cn根服务器被攻击之后
  • .NET Framework 的 bug?try-catch-when 中如果 when 语句抛出异常,程序将彻底崩溃
  • .NET 命令行参数包含应用程序路径吗?
  • .NET 线程 Thread 进程 Process、线程池 pool、Invoke、begininvoke、异步回调