1.if name == 'main’的解析 if name == 'main’相当于Python模拟的程序入口,当.py文件被直接运行时,if name == 'main’之下的代码块将被运行;当.py文件以模块形式被导入时,if name == 'main’之下的代码块不被运行。
2.格式化输出
- format格式化
print('{0},{1}'.format("xiao", 1122)) # 若无顺序要求默认依次填充 序号可以控制后面输出的顺序
print('{name},{age}'.format(name = "xiao", age = 90)) # 这里没有顺序要求
填充与对齐
# 填充与对齐
# 填充常跟对齐一起使用
# ^、分别是居中、左对齐、右对齐,后面带宽度
# :号后面带填充的字符,只能是一个字符,不指定的话默认是用空格填充
print('{:>8}'.format('fei')) # 右对齐 8位数据 空格填充
print('{:0>8}'.format('fei')) # 右对齐 8位数据 0填充
精度与类型f
print ('{:.2f}' .format(3.141592)) # 保留2位小数
输出结果 2.%控制格式的输出 将format的位置换成%,去掉前面的小数点即可.前面需要输出的位置不再是中括号控制,而是%加控制符,与c语言类似。
print('My name is %s' % "mingfei") #与c语言类似
print('My name is %s, and I am %d years old.' % ("mingfei", 60)) # 多个控制位输出采用元组类型
3.变量的存储与地址 在Python:一切变量都是对象
变量保存的仅为值的引用,即变量是内存及其地址的抽象
变量的存储采用了引用语义的方式,变量在内存之中所存储的仅仅为变量的值所在的内存地址,而非值本身(变量中存储的是地址)
Python支持相同的值的不同对象,相当于内存中对于同值的对象保存了多份,但是这只是对于可变数据类型适用,对于不可变数据类型,内存中只能有一个相同值的对象
引用语义: 存储变量所需要的存储空间大小一致,因为变量仅仅保存了一个引用
引用语义被称为对象语义和指针语义
变量的每一次初始化赋值,都会开辟一个新的存储空间,并将新的内容的地址赋值给变量。 对于Python中的复杂数据类型(如:列表,字典等),如果仅仅是对其中的一个或多个元素进行修改,并不会改变其地址,如果进行删除或者添加操作,也只是单纯的改变内部元素的地址引用,但是,如果对整体进行重新赋值,那么就会对这些复杂数据类型重新赋予一个新的地址,来覆盖之前的地址,也只有在这种情况下,这些复杂数据类型的地址才会发生改变
ls1 = [122, 'balbal', 98]
ls2 = ls1 # 用“=”进行复制时,只是会给现存的对象添加一个新的引用,并不会在内存中生成新的对象 两个变量指向了同一个值
ls3 = ls1[:] # 分片[:]复制 会创建一个新的对象 地址是不同的 copy()函数和分片相同
ls1[0] = 25
print(ls1)
print(ls2)
print(ls3)
可变数据类型:列表list和字典dict
不可变数据类型:整型int、浮点型float、字符串型string和元组tuple
值语义: 直接把变量的值保存在变量的存储区域里面,每一个变量在内存中所占空间就需要根据变量的实际大小来决定,如C语言
引用传递与值传递: 可变对象为引用传递,不可变对象为值传递。(函数传值) 值传递:对于函数输入的参数对象,函数执行中首先生成对象的一个副本,并在执行过程中对副本进行操作。执行结束后对象不发生改变,即在堆栈中开辟了内存空间以存放由主调函数放进来的实参的值,从而成为了实参的一个副本。值传递的特点是被调函数对形式参数的任何操作都是作为局部变量进行,不会影响主调函数的实参变量的值。
引用传递:当传递列表或者字典时,如果改变引用的值,就修改了原始的对象。(被调函数新开辟内存空间存放的是实参的地址) 但是,在函数调用中直接修改整个列表,也是相当于创建副本的值传递,如果这样做,就是相当于也是相当于创建副本的值传递,
总之,python不允许程序员选择采用传值还是传引用。Python参数传递采用的肯定是“传对象引用”的方式。这种方式相当于传值和传引用的一种综合。如果函数收到的是一个可变对象(比如字典或者列表)的引用,就能修改对象的原始值--相当于通过“传引用”来传递对象。如果函数收到的是一个不可变对象(比如数字、字符或者元组)的引用,就不能直接修改原始对象--相当于通过“传值’来传递对象。
4.闭包 在使用函数过程中不经意间就会触发闭包,因为总会出于某种原因会在一个函数内部再定义一个函数,而当内层函数引用了外层函数命名空间内的变量(或者说对象),这时就会触发闭包。 闭包形成条件:
- 必须有一个内嵌函数 -->这对应函数之间的嵌套
- 内嵌函数必须引用一个定义在闭合范围内(外部函数里)的变量 -->内部函数引用外部变量
- 外部函数必须返回内嵌函数 -->必须返回内部函数
def outer( a ):
4 b = 10
5 # inner是内函数
6 def inner():
7 #在内函数中 用到了外函数的临时变量
8 print(a+b)
9 # 外函数的返回值是内函数的引用
10 return inner
11
12 if __name__ == '__main__':
14
14 #此时外函数两个临时变量 a是5 b是10 ,并创建了内函数,然后把内函数的引用返回存给了demo
15 # 外函数结束的时候发现内部函数将会用到自己的临时变量,这两个临时变量就不会释放,会绑定给这个内部函数
16 demo = outer(5) # 外函数返回的内函数 demo 指向内函数入口
17 # demo存了外函数的返回值,也就是inner函数的引用,这里相当于执行inner函数 inner是一个函数的引用,这个引用被存入了demo中。所以接下来我们再进行demo() 的时候,相当于运行了inner函数。
19 demo() # 15
print (demo.__closure__)
# 其实闭包函数相对与普通函数会多出一个closure的属性,里面定义了一个元组用于存放所有的cell对象,每个cell对象一一保存了这个闭包中所有的外部变量。
#一旦形成闭包之后,python会将__closure__和闭包函数绑定作为储存闭包变量的场所。
闭包的作用:装饰器