一、元组传值:

一般情况下函数传递参数是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. [学习笔记]min_25筛

    神佬yyb 神佬zsy 想不到花了两个小时的时间看 \(min\_25\) 筛就看懂了 实际去追了一下魔禁3 我们先举个例子.如求 \[\sum_{i=1}^{n}f(i)\] 其中 \(f(i)\) ...

  2. SVM的代码实现-python

    隔了好久木有更新了,因为发现自己numpy的很多操作都忘记了,加上最近有点忙... 接着上次 我们得到的迭代函数为 首先j != yi j = yi import numpy as np def sv ...

  3. Linux - route & traceroute & ip

    route route - show / manipulate the IP routing table route 命令常用命令示例 #显示路由 route route -n # 不解析名字,快速显 ...

  4. Celery启动Django项目:Client sent AUTH, but no password is set 错误处理

    celery -A CeleryTest worker -l info [2017-02-22 07:26:52,666: ERROR/MainProcess] consumer: Cannot co ...

  5. Django设置联合唯一约束 -- migrate时报错处理

    异常信息: a unique database constraint for 2 or more fields together 场景描述: 对于ORM中多对多关系的中间表,如果该关系表是手动创建的, ...

  6. List集合和Set集合的遍历方法

    Set集合遍历方法: 对 set 的遍历 1.迭代遍历: Set<String> set = new HashSet<String>(); Iterator<String ...

  7. fastjson的JSONArray转化为泛型列表

    背景:一个复杂结构体内部可能有array的数据,例如:{name:"test",cities:[{name:"shanghai",area:1,code:200 ...

  8. CSS动画原理及硬件加速

    一.图层 图层即层叠上下文,具体概念和应用大家可以看我之前转自张鑫旭大神博客的<CSS层叠上下文和层叠顺序>,这里我们简单复习一下产生层叠上下文的原因. 1.根层叠上下文 指的是页面根元素 ...

  9. Android Studio常用设置

    Android  Studio显示行号 File-->Setting(Ctrl+Alt+S),选择Editor-->General-->Appearance,右侧勾选Show lin ...

  10. 深入理解.sync修饰符

    原文地址:http://www.geeee.top/2019/04/17/vue-sync/ 转载请注明出处 .sync修饰符 一个组件上只能定义一个v-model,如果其他prop也要实现双向绑定的 ...