广受好评的Django教程现已更新至3.1版本,进行了全面细致的修订,添加了重要内容,更深入更丰富,恳请大家继续支持,衷心感谢!


user_image
By  夏目要坚强    On   2019年5月28日 08:46

背景知识: * Names(Identifiers): 名称/标识符,是对象的引用/别名。 * 常见的名称/标识符有:变量名,函数名,类名,模块名,函数的形参等。 * 名称绑定(Banding of Names):当被python解释器执行时,名称必须是绑定到对象的,不能单独存在。而被名称绑定的对象,如果在内存中不存在,就会被创建。 * 注释: * 解释器执行到函数的定义时,首行def定义的函数名会被evaluate成一个函数体,圆括号中被赋默认值的形参,会实现形参(名称)到默认值(对象)的绑定(默认值如果在内存中不存在,会被创建),而那些并没有被赋默认值的形参,并不会被evaluate。 * 函数体(func-body)中的语句,只有在函数被调用时,才会被解释器执行。 * 名称绑定到对象发生在以下几种情形: * 对变量进行赋值操作(使用赋值运算符 = ),变量名绑定到对象。 * 类定义,类名绑定到类对象。 * 函数定义:函数名绑定到函数对象。 * 在交互式模式下,函数定义完成后,函数对象在内存中建立,当前的符号表中,函数名也绑定到了函数对象。不过此时函数体中的语句并没有执行,只有调用函数时,函数体中的语句才会执行。 * 在脚本模式下,代码执行完函数定义后,函数对象在内存中建立,函数名也绑定到了函数对象。不过此时函数体中的语句并没有执行,只有调用函数时,函数体中的语句才会执行。 * 函数定义:形参被赋默认值时。被赋默认值的形参到默认值的绑定发生在解释器执行到函数定义首行时,而且值的绑定只处理一次,随后对函数对象的调用时,如果没有明确再传入新的值,那么并不会再次对已经给与默认值的形参进行再次绑定。参考:Default parameter values are evaluated from left to right when the function definition is executed. * 函数调用:除了被赋默认值以外的形参到实参的绑定发生在函数调用时! * import语句,模块名绑定到模块对象。 * for循环(for i in iterables:), 变量名i在每一次循环中都会绑定到可迭代对象中的元素。 * as操作:不熟,后期再添加。 函数的参数: * 形参(parameters/formal parameters): 函数定义时,函数名后括号中定义的参数(名称) * 实参(arguments/actual parameters):函数调用时,传递给函数(对象)的参数(对象),而参数的传递,本质是将形参(名称)绑定到实参(对象),这个名称绑定的实现方式是:解释器将实参(对象)的内存地址传入函数对象,这样形参就可以根据内存地址找到对象,进行绑定。 * 所以,简单来说,形参是Name, 而实参是Object。函数调用时的传递参数,即实现 形参到实参的绑定。 * 传递的实参也可以是一个变量名,这样的话,本质是 形参绑定到 变量绑定的对象,仍然是形参绑定到对象。 函数参数的分类: * 形参定义格式分类: * 普通形参: * 格式(Form):parameter * 可接受的实参传递的方式: * 一个位置实参 * 或者 一个关键字实参 * 被赋默认值的形参: * 格式:parameter = default_value * 可接受的传递实参的方式: * 零个实参,也就是可以不传参,此时使用默认值 * 或者 一个位置实参 * 或者 一个关键字实参 * 有单个星标前缀的形参: * 格式:*parameter * 可接受的传递实参的方式: * 任意多个位置实参(包括零个) * 有两个星标前缀的形参: * 格式:**parameter * 可接受的传递实参的方式: * 任意多个 关键字实参(包括零个) * 传递实参格式分类: * 关键字实参(keyword arguments): * 通过指明形参名称传递实参: * 格式:key_arg=value: * 样例:complex(real=3, imag=5),其中3和5是关键字实参 * 通过字典对象传递实参: * 格式:**dict_object,其中dict_object中,key是形参名称,value是实参值(对象)。 * 样例:complex(**{'real': 3, 'imag': 5}),其中,real,imag是形参名称,3和5是实参。 * 位置实参(positional arguments): * 未指明形参名称的实参: * 格式:argument * 样例:complex(3, 5),其中3和5是位置实参。 * 通过可迭代对象传递实参: * 格式:*iterable,其中iterable的元素就是实参值(对象) * 样例:complex(*(3, 5)),其中元组(3,5)的元素3和5就是位置实参。