一、元组传值:

一般情况下函数传递参数是1对1,这里x,y是2个参数,按道理要传2个参数,如果直接传递元祖,其实是传递一个参数

>>> def show( x, y ):
... print x, y
...
>>> a = ( 10, 20 )
>>> show( a, 100 )
(10, 20) 100

而如果要把一个元祖( 有2项 )传给x和y,传递的时候要用*a,如果一个函数要3个参数,就不能传递2项的元祖

>>> def show( x, y ):
... print "%s : %s" % ( x, y )
...
>>> a=(10,20)
>>> show(*a)
10 : 20
>>> b=(10,20,30)
>>> show(*b)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: show() takes exactly 2 arguments (3 given)
print "%s : %s" % ( x, y )

这个百分号%s 类似c语言的printf,占位符  表示要用一个字符串来解释,后面的% ( x, y ) 就是传值.  x传给第一个%s, y传给第二个%s

如果后面不传值,就是打印字符串本身

>>> print "%s : %s" % ( 'hello', 'ghostwu' )
hello : ghostwu
>>> print "%s : %s"
%s : %s

二、变量作用域跟javascript一样

函数外面定义的是全局变量,可以在函数里面或者外面访问

函数里面定义的是局部变量,函数调用完毕之后会被释放

>>> myname = 'ghostwu'
>>> def show():
... print myname
... x = 10
...
>>> show()
ghostwu
>>> x
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'x' is not defined
>>> myname
'ghostwu'
>>>

global关键字可以把局部变量变成全局变量,这点跟php不一样(php是把全局变量引用到函数内部使用)

>>> def show():
... global a
... a = 10
...
>>> show()
>>> a
10

同名的全局变量和局部变量,函数内访问的是局部变量,外面是全局变量

>>> a = 100
>>> def show():
... a = 10
... print a
...
>>> a
100
>>> show()
10
>>> a
100

如果,同名的局部变量被global,并且函数被执行,那么函数执行之后 在输出这个变量,就是局部变量中的值

>>> a = 1
>>> def show():
... global a
... a = 2
...
>>> a
1
>>> show()
>>> a
2

三、函数的默认参数

>>> def show( name = 'ghostwu', age = 20 ):
... print "name: %s" % name
... print "age: %s" % age
...
>>> show()
name: ghostwu
age: 20
>>> show( 'zhangsan', 30 )
name: zhangsan
age: 30

四,如果传递一个元组,他们是按对应的位置传递,不会智能判断变量的顺序

>>> t=(100,'zhangsan')
>>> show( *t )
name: 100
age: zhangsan
>>>

你会发现, 100传递给了name, zhangsan传递给了age

如果用字典传递,就会按键值对对应,传参数时用两个**

>>> show()
name: ghostwu
age: 20
>>> d={"age":30,"name":"zhangsan"}
>>> show( *d )
name: age
age: name
>>> show( **d )
name: zhangsan
age: 30
>>>

五,接收多余的参数

>>> def show( x, *args ):
... print x
... print args
...
>>> show(1)
1
()
>>> show( 1, 2, 3, 4, 10 )
1
(2, 3, 4, 10)
>>>

形参*args可以接收不定参数,es6有类似的特性

六、接收字典类型的不定参数

>>> def show( x, *targs, **dargs ):
... print x
... print targs
... print dargs
...
>>> show( 10 )
10
()
{}
>>> show( 10, 20, 30, 40 )
10
(20, 30, 40)
{}
>>> show( 10, 20, 30, a = 100, b=200 )
10
(20, 30)
{'a': 100, 'b': 200}

python变量作用域,函数与传参的更多相关文章

  1. python -- unittest测试用例函数无法传参的处理方法(ddt)

    1.超继承 重写测试用例类的init方法,如下所示. import requests import unittest class XiaoheiCases(unittest.TestCase): de ...

  2. Python全栈工程师(函数的传参)

     ParisGabriel   感谢 大家的支持                                                               每天坚持 一天一篇 点个订 ...

  3. Python之函数(一)定义函数以及传参

    定义函数以及传参 函数的定义 def 函数名(): 函数体 例子: def func():#def关键字--定义 func函数名--和变量定义规则一样 ()必须要写格式 :声明 语句结束 s=[1,2 ...

  4. Python 变量作用域与函数

    Python 的创始人为吉多·范罗苏姆(Guido van Rossum).1989年的圣诞节期间,吉多·范罗苏姆为了在阿姆斯特丹打发时间,决心开发一个新的脚本解释程序,作为ABC语言的一种继承.Py ...

  5. python变量作用域

    [python变量作用域] 几个概念: python能够改变变量作用域的代码段是def.class.lamda. if/elif/else.try/except/finally.for/while 并 ...

  6. Python 变量作用域 LEGB (上)—— Local,Global,Builtin

    Python 变量作用域的规则是 LEGB LEGB含义解释:L —— Local(function):函数内的名字空间E —— Enclosing function locals:外部嵌套函数的名字 ...

  7. C#为什么不能像C/C++一样的支持函数只读传参

    C#为什么不能像C/C++一样的支持函数只读传参? 这个问题其实问的人挺多的,我自己也经常想实现这个功能,但是发现总是那么的不尽人意. 有些人倒是给出了一下答案,但是都不能很好的解决像C/C++一样的 ...

  8. C# PDF Page操作——设置页面切换按钮 C# 添加、读取Word脚注尾注 C#为什么不能像C/C++一样的支持函数只读传参 web 给大家分享一个好玩的东西,也许你那块就用的到

    C# PDF Page操作——设置页面切换按钮   概述 在以下示例中,将介绍在PDF文档页面设置页面切换按钮的方法.示例中将页面切换按钮的添加分为了两种情况,一种是设置按钮跳转到首页.下页.上页或者 ...

  9. Python 变量作用域 LEGB (下)—— Enclosing function locals

    上篇:Python 变量作用域 LEGB (上)—— Local,Global,Builtin https://www.cnblogs.com/yvivid/p/python_LEGB_1.html ...

随机推荐

  1. 关于Maven整合SSM项目中报错Invalid bound statement (not found):的问题解决

    如图:控制不报错 页面就是报500的错误 查阅了好多资料  都说是Mapper文件写的不对  我仔细找了好几遍也解决不了问题.. 解决: 坑爹的问题害我找了一上午原因,原来是需要在pom.xml文件中 ...

  2. Yii2+Swagger搭建RESTful风格的API项目

    在现有的Advanced Template上搭建RESTful API项目的步骤: 本案例前提说明: 本例中不使用\yii\rest\ActiveController自动创建的API,而是自定义一个A ...

  3. odoo开发笔记 -- context上下文

    字段级别 视图级别 窗口动作级别

  4. Xamarin 绑定安卓第三方库恢复原始参数问题

    大家都知道在绑定xamarin android 第三方库的时候 参数名是乱码的 变成了p1  p2  p3 之类的 这样在实际使用的时候非常不方便. 其实xamarin是提供了三种方式帮助大家恢复ja ...

  5. Task异步编程,刨根到底

    1. 编译器到底对await做了什么 await 一个异步操作的时候,实际上编译器会创建一个状态机,这个状态机包含了调用者的上下文变量,状态机使用yield迭代器实现,状态机由clr调度,每次运行都会 ...

  6. centos系统(ssh)登录缓慢(输入账户密码后需要等待若干时间)

    现象:打开ssh连接工具,输入用户名密码,需要等待约3分钟才能进入系统,进入系统后操作都很流畅,同时top查看系统消耗也很低! 解决:在百度和谷歌搜索大量解决方案,都是如下解决方案: #取消ssh的反 ...

  7. 课程一(Neural Networks and Deep Learning),第二周(Basics of Neural Network programming)—— 3、Python Basics with numpy (optional)

    Python Basics with numpy (optional)Welcome to your first (Optional) programming exercise of the deep ...

  8. 在Storm的Toplogy中设置多数据源Spout

    上代码:主要看main方法中的设置.   如下代码是一般情况下的设置方法...Trident中设置多数据源看对应的博客总结 /** * 指定多个数据源 * 数字累加求和 * 先添加storm依赖 */ ...

  9. 一眼看穿flatMap和map的区别

    背景 map和flatmap,从字面意思或者官网介绍,可能会给一些人在理解上造成困扰[包括本人],所以今天专门花时间来分析,现整理如下: 首先做一下名词解释---------------------- ...

  10. IdentityServer4之Clients、Scopes、Claims与Token关联

    IdentityServer4之Clients.Scopes.Claims与Token关联 参考 官方文档:client.identity_resource.api_resource:三类配置项介绍描 ...