来自 计算机编程 2019-12-12 00:00 的文章
当前位置: 澳门威尼斯人平台 > 计算机编程 > 正文

python3.x的print()函数默认参数

当def函数参数默认值为对象时,例如列表[],字典{}

使用默认参数时,参数会形成一个独立的作用域,此作用域与函数体中的作用域是平行关系

python3.x的print()函数默认参数

初学python ,写了个99乘法表,

for i in range(1, 10) :
    for j in range(1, i+1) :
        print(j, 'x', i, '=', j*i,,end='t')
   print('n')

 

 

这里end='t'表示以TAB结尾

开始并不知道加end参数,所以每次输出完一行就自动换行再输出第二行

>>> help(print)
Help on built-in function print in module builtins:

print(...)
    print(value, ..., sep=' ', end='n', file=sys.stdout, flush=False)

    Prints the values to a stream, or to sys.stdout by default.
    Optional keyword arguments:
    file:  a file-like object (stream); defaults to the current sys.stdout.
    sep:   string inserted between values, default a space.
    end:   string appended after the last value, default a newline.
    flush: whether to forcibly flush the stream.

 

sep表示值与值之间默认以空格相隔开,end表示结尾默认换行

 

另外在python2.X中,只需要在print后面添加逗号就可以

初学python ,写了个99乘法表, for i in range(1, 10) : for j in range(1, i+1) : print(j, x, i, =, j*i,,end=t) print(n) 这里en...

1 基本概念

 

var x = 0;
function foo(x, y = function(){ x = 2; console.log(x); }) {
    var x = 3;
    y();
    console.log(x);
}
foo();
console.log(x);

1.1 命名空间 (namespace)

命名空间是变量名到对象的映射(name -> obj)。目前大多数的命名空间以类似于python字典的形式实现,实现形式在未来可能发生变化。命名空间举例:内置变量(内置函数abs, 内置的异常等),模块中的全局变量,函数调用时的局部变量。在某种意义上讲,对象的属性也形成一个命名空间。重要的是,不同的命名空间中的变量没有任何关联,两个不同的命名空间中可以包含相同的变量名。

命名空间有不同的创建时间和生命周期:

  • 内置变量命名空间在python解释器启动时创建,并且在解释器运行期间永远不会被删除;
  • 一个模块的命名空间在模块被导入时创建,并且到解释器退出会一直存在;
  • 函数的本地(局部)命名空间在函数调用时创建,函数退出时删除;
  • 解释器顶层执行的语句都是 __main__ 模块的组成部分,它们有自己的命名空间。

注:内置变量实际上同样是以模块的形式存在,模块名为 builtins 。

示例1:猜测一下,会输出什么??? 

经过测试发现,此段代码如果使用babel编译成es5~输出结果为 2 2 0

1.2 作用域 (scope)

作用域是Python程序中可以直接访问一个命名空间内变量的文本区域,在这里可直接访问表示不受任何限制,即命名空间内的变量在该文本区域内可见、可引用。对于函数而言,作用域和命名空间可以认为是等价的,特定的作用域对应特定的命名空间,它们可以直接对等。

  • 本地(局部)作用域:函数或者类的内部,对应函数调用时的函数的命名空间。
  • 全局作用域:整个程序的运行环境,对应‘__main__’模块的命名空间。

全局作用域中无法直接访问本地作用域中定义的变量:

def func1():
    name = 1

print(func1)    # <function func1 at 0x101a03d08>
print(name)
# Traceback (most recent call last):
#   File "<stdin>", line 1, in <module>
# NameError: name 'name' is not defined

 

本地作用域中的变量定义:

  • 在python中,变量赋值即定义。在局部作用域内被赋值的变量,除非由 global 或者 nonlocal 声明,否则全部为局部变量,函数调用时存在于函数命名空间。
  • global var : 声明变量 var 为全局变量,它所有的引用和赋值都在模块的命名空间进行,作用域为全局作用域
  • nonlocal var : 将外层函数命名空间中的变量 var 绑定到本地作用域,使其在本地作用域可重新赋值。如果变量没有被声明为 nonlocal,这些变量在本地作用域仅可读,尝试给变量赋值则会在本地命名空间创建一个同名变量。

nonlocal声明的变量在上层函数中必须存在,否则报错:

1 test = 'global variable'
2 
3 def scope_test():
4     def inner():
5         nonlocal test
6         print(test)
7 
8 scope_test()    # SyntaxError: no binding for nonlocal 'test' found
def ddd(a,b=[]):
    b.append(a)
    return b

print(ddd(1))
print(ddd(2,['a','b','c']))
print(ddd(3))

澳门威尼斯人平台 1

2 示例

 

Paste_Image.png

2.1 本地作用域中变量的搜索遵守LEGB规则

  1. L-Local(function):函数内,其中的变量称为本地变量;
  2. 澳门威尼斯人平台,E-Enclosing function locals:外层函数中的变量(例如closure),包含被声明为non-local的变量
  3. G-Global(module):函数定义所在模块,其中的变量称为全局变量
  4. B-Builtin(Python):Python内置模块

    1 def scope_test(): 2 def do_local(): 3 spam = "local spam" 4 5 def do_nonlocal(): 6 nonlocal spam  # 递归向上寻找上层函数命名空间中的spam变量 7 spam = "nonlocal spam" 8 9 def do_global(): 10 global spam # 在全局变量中寻找spam变量,没有则创建 11 spam = "global spam" 12 13 spam = "test spam" 14 do_local() 15 print("After local assignment:", spam) # 输出本地变量 spam 16 do_nonlocal() 17 print("After nonlocal assignment:", spam) 18 do_global() 19 print("After global assignment:", spam) 20 21 scope_test() 22 print("In global scope:", spam)

结果

1 After local assignment: test spam
2 After nonlocal assignment: nonlocal spam
3 After global assignment: nonlocal spam
4 In global scope: global spam

[1]  ['a','b','c','2'] [3]   ?????你是否认为是这样? 输出一下看看

这个结果和开头的结论并不符合~原因我暂时将其理解成babel的编译和原本es6的语法定义还是有点出入的
编译后的代码如下:

2.2 闭包

闭包:在嵌套函数中,如果内层函数引用了外层函数的变量,就形成了一个闭包。

自由变量:被引用的外层函数变量,称为内层函数的自由变量。

def fn():
    a = 1
    def closure():
        nonlocal a
        a += 1
        print(a)
    return closure

inner = fn()  
print(inner.__closure__)    # (<cell at 0x10240b408: int object at 0x100277bc0>,)
inner()  # 2
inner()  # 3

外层函数执行完,其命名空间删除。但是因为 a 是内层函数的自由变量,所以变量 a 被保留,可以看作是 closure 函数对象的一个附加属性。

本文由澳门威尼斯人平台发布于计算机编程,转载请注明出处:python3.x的print()函数默认参数

关键词: