zoukankan      html  css  js  c++  java
  • python变量作用域,函数与传参

    一、元组传值:

    一般情况下函数传递参数是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}
  • 相关阅读:
    随手
    会使用基本的Render函数后,就会想,这怎么用 v-for/v-if/v-model;我写个vue Render函数进阶
    iframe子页面与父页面元素的访问以及js变量的访问[zhuan]
    vue element-ui 的奇怪组件el-switch
    URLSearchParams和axios的post请求(防忘记)
    ios vue2.0使用html5中的audio标签不能播放音乐
    Unity Input System教程
    关于OpenGPU.org
    Better ultra_simple for Slamtec RPLIDAR on Linux
    八字心得
  • 原文地址:https://www.cnblogs.com/ghostwu/p/8598019.html
Copyright © 2011-2022 走看看