__ == '__main__': int_test() 有i和j俩个变量的值为77,通过打印77的ID和变量i,j在内存中的id我们得知它们都是指向同一块内存。...然后我们修改j的值,让j的值+1.按道理j修改之后应该i的值也发生改变的,因为它们都是指向的同一块内存,但结果是并没有。...,原来外部的变量也应该受到影响。...但是上面我们说到了python中有可变类型和不可变类型,这样的话,当传过来的是可变类型(list,dict)时,我们在函数内部修改就会影响函数外部的变量。...而传入的是不可变类型时在函数内部修改改变量并不会影响函数外部的变量,因为修改的时候会先复制一份再修改。
工具脚本就是通过sys.argv读取使用参数 最后,注意到这两行代码 if __name__=='__main__': test() 当我们在命令行运行hello模块文件时,Python解释器把一个特殊变量...__name__置为__main__,而如果在其他地方导入该hello模块时,__name__则为其他地方,if判断将失败,因此,这种if测试可以让一个模块通过命令行运行时执行一些额外的代码,最常见的就是运行测试...name__就是特殊变量,hello模块定义的文档注释也可以用特殊变量__doc__访问,我们自己的变量一般不要用这种变量名; 类似_xxx和__xxx这样的函数或变量就是非公开的(private),不应该被直接引用...换句话说,仅仅是声明而已,要访问还是能访问的,private函数或变量不应该被别人引用,那它们有什么用呢?...private函数隐藏起来了,这样,调用greeting()函数不用关心内部的private函数细节,这也是一种非常有用的代码封装和抽象的方法,即: 外部不需要引用的函数全部定义成private,只有外部需要引用的函数才定义为
__ == '__main__': # 开启游戏服务 start() Linux 平台上,一个 python 源码文件应该以下部分组成。...Windows 平台上,编码格式声明必须位于 python 文件的第一行。Linux 平台上,编码格式声明通常位于 python 文件的第二行,第一行是 python 解释器的路径声明。 #!...# ===================================== if __name__ == '__main__': server.run() 空行 编码格式声明...、模块导入、常量和全局变量声明、顶级定义和执行代码之间空两行 顶级定义之间空两行,方法定义之间空一行 在函数或方法内部,可以在必要的地方空一行以增强节奏感,但应避免连续空行 空格 在二元运算符两边各空一格...如果文档字符串内容不能在一行内写完,首行须以句号、 问号或惊叹号结尾,接一空行,结束的三重双引号必须独占一行。 导入模块 导入总应该放在文件顶部,位于模块注释和文档字符串之后,模块全局变量和常量之前。
让我们先使用一段代码示例来探索导入和脚本的工作方式。假设这些代码位于名为foo.py的文件中。...python foo.py Python解释器会使用下面的代码为__name__变量赋值,也就是说,__name__变量的值是"__main__"。...B 10.0 after __name__ guard 如果当前的Python脚本按着主程序的方式执行(使用python命令),那么__name__变量的值就是"__main__"。...module 如果一个Python脚本,同时即可以作为主程序执行,也可以作为模块被导入,这就要求在模块被导入时不执行作为主程序执行时的代码,所以如果是在主程序中执行的代码,应该使用__main__变量进行判断...关于__name__的一些疑问 有的同学问,在脚本文件中可以有多个__name__校验代码块吗?
_protected) if __name__ == "__main__": p1 = protectedson() p1.test() print("子类实例对象调用类属性...__private) def __test(self): print("私有方法") if __name__ == "__main__": p1 = privates...类内部调用私有变量: 私有变量 类对象 - 外部调用私有变量 私有变量 私有方法 知识点 在变量和方法前加两个下划线 即可变成private类型的变量or方法 __ 子类无法访问父类的私有变量、方法...外部真的不能访问吗?其实是可以访问的,python解释器对外会把 变成 _类名__私有变量 ,无论是实例对象还是类对象,都能通过 ...._类名__私有变量 来调用私有变量,算是一种间接调用 __私有变量 总结 无论是受保护型变量还是私有变量,其实在外部还是能访问的,所以并不能真正控制属性的访问权限; 带着疑问 那我们如何才能控制属性的访问权限呢
if __name__ == '__main__'的意思是: 当.py文件被直接运行时,if __name__ == '__main__'之下的代码块将被运行;当.py文件以模块形式被导入时,if __...name__ == '__main__'之下的代码块不被运行。...3.2、__name__表示当前模块的名字 __name__是内置变量,可用于表示当前模块的名字。...所以,if __name__ == '__main__'的意思是:当.py文件被直接运行时,if __name__ == '__main__'之下的代码块将被运行;当.py文件以模块形式被导入时,if...__name__ == '__main__'之下的代码块不被运行。
1.类(对象)的定义和使用一个class类的定义大致如下:1.首行是class 开头,然后类名字+:号结尾2.类的内部定义各种函数和变量;3.函数内就封装各种功能。...例子:def public_method(self): print("这是一个公有方法")私有方法以双下划线__开始的方法被视为私有方法。只能在其类定义内部被访问,从外部不能直接访问。...__private_method() 调用失败")为了防止报错阻挡其他的打印,这里依然用到了try代码块。...它们不能从类的外部直接访问,只能在类的内部使用。私有属性通常用于类的内部逻辑,不希望外部访问。例子:class MyClass: def __init__(self): self....__private_attribute = "这是一个私有属性" 受保护的属性:以单个下划线_开头的属性被视为受保护的。这是一种约定,用于指示属性不应该在类的外部使用,尽管实际上它们可以被访问。
注意,当13行调用了show函数时, show函数内部的closure函数并没有调用,只是做了定义并返回给了fun变量, 在15行执行时才进行了调用。...我们都知道在函数内部定义的局部变量, 当函数执行完后就应该释放了, 而15行执行时正确输出了str变量中的值, 说明局部变量中的str变量并未释放。...这就是闭包带来的效果,如果把show函数看成是外部函数, closure函数看成是内部函数, 则这个内部函数即为闭包函数。所以闭包可以理解成定义在一个函数内部的函数。...world" def closure(): print(str) return closure if __name__ == '__main__': fun...那如果仍要使用外部函数中的变量呢? 解决办法是用nonlocal关键字声明变量。
Python中要想定义的方法或者变量只能在类内部使用不被外部使用,可以在方法和变量前面加两个下划线,让其变为私有方法或私有变量。...__work) def __eat(self): print('1111') __work是私有类变量,类外是无法访问的 if __name__ == '__main__':...__work)AttributeError: 'Person' object has no attribute '__work' __age是私有实例变量,类外类实例对象是无法访问的 if __name...code 0 __eat()是私有方法,类外是无法访问的 if __name__ == '__main__': test1 = Person('王大力','22') print(test1....,类外部可以通过 ”_Person___私有属性(方法)名“ 访问私有属性(方法) if __name__ == '__main__': print(Person.
,底层基础决定上层建筑嘛,基础打牢一些,对今后的编程还是会有些帮助的。 ...函数定义了本地作用域,函数除了打包代码外,函数还为程序增加了一个额外的命名空间层:在默认情况下,一个函数的所有变量名都与函数命名空间相关联,这就意味着:一个def内定义的变量名能够被def内代码使用,不能在函数外部引用这样的变量名...模块定义的是全局作用域。本地作用域与全局作用域有如下关系: . 内嵌的模块是全局作用域。每个模块都是一个全局作用域,对于外部的全局变量就变成了模块的属性 . ...赋值的变量名除非声明为全局变量,否则均为本地变量。在默认情况下,使用函数定义内部的变量名是位于本地作用域内的。...如果想给一个在函数内部却位于模块文件顶层的变量嘛赋值(也就是说想在函数内部给全局变量名赋值)就需要在函数内部使用global语句声明,否则按照LEGB原则,函数内部会认为它是本地变量。
3.8.5块和内联注释 最需要写注释的是代码中那些技巧性的部分.如果你在下次代码审查的时候必须解释一下,那么应该马上写注释.对于复杂的操作,应该在其操作开始前写上注释.对于不是一目了然的代码,应在其行尾添加注释...,位于模块注释和文档字符串之后,模块全局变量和常量之前.导入应该按照从最通用到最不通用的顺序分组: Python将来的导入语句。...3.17 Main 在Python中, pydoc以及单元测试要求模块必须是可导入的.代码应该在执行主程序前总是检查 if __name__ == '__main__' , 这样当模块被导入时主程序就不会被执行...__ == '__main__': app.run(main) 否则,请使用: def main(): ... if __name__ == '__main__': main()...Yes:def func(a: int = 0) -> int: ...No:def func(a:int=0) -> int: ... 3.19.5键入变量 如果内部变量的类型很难或无法推断,则可以通过两种方式指定其类型
闭包 绑定外部变量的函数 返回一个绑定外部变量的内部函数 嵌套函数 内部函数用到了外部变量 外部函数返回内部函数 def pow_x(x): def echo(value): ...x=2 return value ** x return echo if __name__=='__main__': lst = (pow_x(2), pow_x(3)..., pow_x(4)) for p in lst: print p(2) 内部变量不能"改变"外部变量 内部函数用到了外部变量为list,则可以从外部或内部改变值,并且即使外部没有引用也不会回收...__ == '__main__': lst2 = pow_y([1, 1]) print "closure powy", lst2(2) print "closure powy"..., lst2(3) print "closure powy", lst2(4) 一个关于闭包的应用 #!
---- 名字空间(Namespace) 比如我们定义一个"变量" In [14]: a NameError: name 'a' is not defined 所以,这里更准确的叫法应该是名字。...分类 python里面有很多名字空间,每个地方都有自己的名字空间,互不干扰,不同空间中的两个相同名字的变量之间没有任何联系一般有4种: LEGB四种 locals: 函数内部的名字空间,一般包括函数的局部变量以及形式参数...内部函数只可以读取外部函数的变量,而不能做修改,其实本质还是因为赋值涉及到了新建locals()的名字。...这个例子其实也给了我们一个启发,我们知道内部函数无法直接修改外部函数的变量值,如例2,如果借助list的话, 就可以了吧!比如把想要修改的变量塞到一个list里面,然后在内部函数里面做改变!...看到这里,对作用域理解应该有一点点了吧。 延伸 与闭包的不同 我们都知道闭包是把外部函数的值放到func.func_closure里面,为什么不像上面的例子一样直接放到函数的名字空间呢?
import os if __name__ == '__main__': """ 返回当前的工作目录 """ """ Return a unicode string representing...在一个模块中,我们可能会定义很多函数和变量,但有的函数和变量我们希望给别人使用,有的函数和变量我们希望仅仅在模块内部使用。而在Python中,是通过_前缀来实现的。...类似__xxx__这样的变量是特殊变量,可以被直接引用,但是有特殊用途,比如上面的__author__,__name__就是特殊变量,hello模块定义的文档注释也可以用特殊变量__doc__访问,我们自己的变量一般不要用这种变量名...类似_xxx和__xxx这样的函数或变量就是非公开的(private),表示这个函数是“内部实现细节”或“私有”的,不应该被直接引用或调用。...如: import my_module as mm # 定义变量名为mm if __name__ == '__main__': # 这里通过重定义的变量名mm访问模块功能 print
最后我们使用finally代码块来关闭打开的文件,释放掉程序中获取的外部资源,由于finally块的代码不论程序正常还是异常都会执行到(甚至是调用了sys模块的exit函数退出Python环境,finally...块都会被执行,因为exit函数实质上是引发了SystemExit异常),因此我们通常把finally块称为“总是执行代码块”,它最适合用来做释放外部资源的操作。...if __name__ == '__main__': main() 除了使用文件对象的read方法读取文件之外,还可以使用for-in循环逐行读取或者用readlines方法将文件按行读取到一个列表容器中...注意如果需要对文件内容进行追加式写入,应该将模式设置为'a'。如果要写入的文件不存在会自动创建文件而不是引发异常。...if __name__ == '__main__': main()
对于每个模块都有所谓的内部和外部之分,从这种角度来看,模块很像一种类,模块内部的代码属于模块的私有成员,由模块控制,对外暴露接口给外部使用。...模块会被作为一个实例,为其内部提供一个全局名字空间,在一次的session中,无论模块的源文件是否发生变化,已经初始化后的实例都不会发生变化。先创建一个module.py文件,放入下面代码。...所以这里牵扯到Python的热更新问题了,标准库提供了importlib.reload方法解决这个问题,但是这个方案缺点在于它并不会递归的修改成员引用(当你模块的成员被其它变量引用时,引用成员并不会发生变化...在module模块添加: print(__name__) 运行本模块,此时__name__返回的是__main__,而直接导入module时会返回模块自身的名字。...'test'] 这样其它的成员便被隐藏了,和类的私有成员一样,这不是真正的意义权限设置,你还是有办法可以看的到。
函数的参数 函数是绝大多数编程语言中都支持的一个代码的构建块,但是Python中的函数与其他语言中的函数还是有很多不太相同的地方,其中一个显著的区别就是Python对函数参数的处理。...解释器直接执行的模块的名字才是__main__ if __name__ == '__main__': print('call foo()') foo() print('call...在上面的foo函数中我们定义了变量b,这是一个定义在函数中的局部变量(local variable),属于局部作用域,在foo函数的外部并不能访问到它;但对于foo函数内部的bar函数来说,变量b属于嵌套作用域...在实际开发中,我们应该尽量减少对全局变量的使用,因为全局变量的作用域和影响过于广泛,可能会发生意料之外的修改和使用,除此之外全局变量比局部变量拥有更长的生命周期,可能导致对象占用的内存长时间无法被垃圾回收...减少全局变量的使用就意味着我们应该尽量让变量的作用域在函数的内部,但是如果我们希望将一个局部变量的生命周期延长,使其在定义它的函数调用结束后依然可以使用它的值,这时候就需要使用闭包,这个我们在后续的内容中进行讲解
Python 函数(三) Python 3 函数 (闭包、装饰器、递归、高阶函数) 一、闭包 内部函数可以引用外部函数的参数和局部变量,当外部函数返回内部函数时,相关参数和变量 都保存在返回的函数中,简单的说...,这种内部函数可以使用外部函数变量的行为,就叫闭包。...例一: def sum_out(*args): def sum_in(): #定义内内部函数 sumV = sum(args) #使用外部函数的args变量...__ == '__main__': f = func f(3,4) 例二(带有不定参数的装饰器): import time def deco(func): def wrapper...__ == '__main__': f = func f(3,4)
2、运行的原理 每个python模块(python文件,也就是此处的test.py和import_test.py)都包含内置的变量__name__,当运行模块被执行的时候,__name__等于文件名(...可以看出,此时变量__name__的值为"__main__"; 再执行import_test.py,模块内容和执行结果如下: # python import_test.py I'm the first.... test 此时,test.py中的__name__变量值为test,不满足__name__=="__main__"的条件,因此,无法执行其后的代码。...__name__ __name__ 是内置变量,用于表示当前模块的名字,同时还能反映一个包的结构。...,则代码块被运行,如果模块是被导入的,则代码块不被运行。
作用域 L(local)局部作用域 作用域范围 只在当前代码块或者当前函数中有效 注意: 当在外部调用时, 会抛出 NameError def local(): total...= 1 # 局部变量 print("local fuction", total) # 输出 # local fuction 1 local() # 在函数外部调用, 报错 #..._, __builtin__ print("__doc__", __doc__) # __doc__ None print("__name__", __name__) # __name__ __main...示例: 使用局部变量报错的例子 total = 1 # 全局变量 def local(): global total print("local fuction", total)...Update nonlocal out_total", out_total) def global_inner(): global out_total # 修改的是全局变量的
领取专属 10元无门槛券
手把手带您无忧上云