文件操作基本流程
文本文件和二进制文件
文本文件:可以使用文本编辑器查看;
二进制文件:保存的内容不是直接给人查看的,而是使用专用软件查看的,例如图片文件、视频文件;
操作文件的套路
-
打开文件;
-
读写文件;
-
读文件:将文件内容读入内存;
-
写文件:将内存内容写入文件;
-
关闭文件;
操作文本文件
<span style="background-color:#dadada"><span style="color:#1f0909"><span style="color:#aa5500"># 1.读取文件句柄——文件名需要注意大小写</span>
<span style="color:#aa5500"># r - read</span>
<span style="color:#aa5500"># w - write #会自动创建 会覆盖之前内容</span>
<span style="color:#aa5500"># a -add #追加</span>
<span style="color:#000000">file</span> <span style="color:#981a1a">=</span> <span style="color:#3300aa">open</span>(<span style="color:#aa1111">"text1.txt"</span>, <span style="color:#aa1111">'w'</span>)
<span style="color:#aa5500"># 2.写</span>
<span style="color:#000000">file</span>.<span style="color:#000000">write</span>(<span style="color:#aa1111">'hello world\n'</span>)
<span style="color:#000000">file</span>.<span style="color:#000000">write</span>(<span style="color:#aa1111">'hello phon\n'</span>)
<span style="color:#aa5500"># 3.关闭,不关闭别人打不开</span>
<span style="color:#000000">file</span>.<span style="color:#000000">close</span>()</span></span>
<span style="background-color:#dadada"><span style="color:#1f0909"><span style="color:#aa5500"># 1.打开文件句柄</span>
<span style="color:#000000">file</span> <span style="color:#981a1a">=</span> <span style="color:#3300aa">open</span>(<span style="color:#aa1111">"text1.txt"</span>, <span style="color:#aa1111">"r"</span>)
<span style="color:#aa5500"># 2.读取</span>
<span style="color:#3300aa">print</span>(<span style="color:#000000">file</span>.<span style="color:#000000">readline</span>()) <span style="color:#aa5500">#只读一行</span>
<span style="color:#3300aa">print</span>(<span style="color:#000000">file</span>.<span style="color:#000000">readline</span>().<span style="color:#000000">strip</span>()) <span style="color:#aa5500"># .strip()去除换行符</span>
<span style="color:#3300aa">print</span>(<span style="color:#000000">file</span>.<span style="color:#000000">readline</span>())
<span style="color:#aa5500"># print(file.readlines())#加s后,以数组形式读取</span>
<span style="color:#aa5500">#全部读取并显示#空行也会被读取</span>
<span style="color:#3300aa">list</span> <span style="color:#981a1a">=</span> <span style="color:#000000">file</span>.<span style="color:#000000">readlines</span>()
<span style="color:#770088">for</span> <span style="color:#000000">i</span> <span style="color:#770088">in</span> <span style="color:#3300aa">list</span>:
<span style="color:#3300aa">print</span>(<span style="color:#000000">i</span>)
<span style="color:#aa5500"># 3.句柄关闭</span>
<span style="color:#000000">file</span>.<span style="color:#000000">close</span>()</span></span>
运行结果
<span style="background-color:#dadada"><span style="color:#1f0909">hello world
hello
hello phon
hello world
hello
hello phon
hello world
进程已结束,退出代码0</span></span>
操作二进制文件
<span style="background-color:#dadada"><span style="color:#1f0909"><span style="color:#aa5500"># r+ -指针在开头,添加内容会覆盖,其余部分保留</span>
<span style="color:#aa5500"># w+ -以读写方式打开文件。若不存在则创建;若文件存在则会被全部覆盖。</span>
<span style="color:#aa5500"># a+ -以读写方式打开文档,指针在结尾添加</span>
<span style="color:#770088">with</span> <span style="color:#3300aa">open</span> (<span style="color:#aa1111">'text1.txt'</span>,<span style="color:#aa1111">'r+'</span>) <span style="color:#770088">as</span> <span style="color:#000000">f</span>:
<span style="color:#000000">f</span>.<span style="color:#000000">write</span>(<span style="color:#aa1111">"10009"</span>)
<span style="color:#770088">with</span> <span style="color:#3300aa">open</span>(<span style="color:#aa1111">'test'</span>,<span style="color:#aa1111">'w+'</span>) <span style="color:#770088">as</span> <span style="color:#000000">f</span>:
<span style="color:#000000">f</span>.<span style="color:#000000">write</span>(<span style="color:#aa1111">"hello"</span>)
<span style="color:#770088">with</span> <span style="color:#3300aa">open</span>(<span style="color:#aa1111">'test'</span>,<span style="color:#aa1111">'w+'</span>) <span style="color:#770088">as</span> <span style="color:#000000">f</span>:
<span style="color:#000000">f</span>.<span style="color:#000000">write</span>(<span style="color:#aa1111">'world'</span>)</span></span>
函数
函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段。
函数的定义与调用
<span style="background-color:#dadada"><span style="color:#1f0909">定义:def 关键词开头,空格之后接函数名称和圆括号(),最后还有一个":"。
def 是固定的,不能变,他就是定义函数的关键字。
空格 为了将def关键字和函数名分开,必须空(四声),当然你可以空2格、3格或者你想空多少都行,但正常人还是空1格。
函数名:函数名只能包含字符串、下划线和数字且不能以数字开头。虽然函数名可以随便起,但我们给函数起名字还是要尽量简短,并能表达函数功能,见文知意
括号:是必须加的,先别问为啥要有括号,总之加上括号就对了!
注释:每一个函数都应该对功能和参数进行相应的说明,应该写在函数下面第一行。以增强代码的可读性。
调用:函数名() 要记得加上括号。</span></span>
函数的返回值
return关键字的作用
-
return 是一个关键字,这个词翻译过来就是“返回”,所以我们管写在return后面的值叫“返回值”。
-
不写return的情况下,会默认返回一个None
-
一旦遇到return,结束整个函数。
-
返回多个值会被组织成元组被返回,也可以用多个值来接收
<span style="background-color:#dadada"><span style="color:#1f0909"><span style="color:#aa5500">#e.g.</span>
<span style="color:#770088">def</span> <span style="color:#0000ff">my_len</span>():
<span style="color:#000000">s</span> <span style="color:#981a1a">=</span> <span style="color:#aa1111">'hello world'</span>
<span style="color:#000000">length</span> <span style="color:#981a1a">=</span> <span style="color:#116644">0</span>
<span style="color:#770088">for</span> <span style="color:#000000">i</span> <span style="color:#770088">in</span> <span style="color:#000000">s</span>:
<span style="color:#000000">length</span> <span style="color:#981a1a">=</span> <span style="color:#000000">length</span> <span style="color:#981a1a">+</span> <span style="color:#116644">1</span>
<span style="color:#770088">return</span> <span style="color:#000000">length</span>
<span style="color:#000000">str_len</span> <span style="color:#981a1a">=</span> <span style="color:#000000">my_len</span>()
<span style="color:#3300aa">print</span>(<span style="color:#000000">str_len</span>)</span></span>
函数的参数
实际的要交给函数的内容,简称实参。 在定义函数的时候它只是一个形式,表示这里有一个参数,简称形参。
python中函数的参数有位置参数、默认参数、可变参数、命名关键字参数和关键字参数,这个顺序也是定义函数时的必须顺序。
默认传参
<span style="background-color:#dadada"><span style="color:#1f0909"><span style="color:#aa5500">#y为形参。默认传参:如果没有给实参,则以默认值使用,若给实参则按实参使用</span>
<span style="color:#770088">def</span> <span style="color:#0000ff">sum1</span>(<span style="color:#000000">y</span><span style="color:#981a1a">=</span><span style="color:#116644">2</span>):
<span style="color:#000000">result</span> <span style="color:#981a1a">=</span> <span style="color:#116644">0</span>
<span style="color:#770088">for</span> <span style="color:#000000">i</span> <span style="color:#770088">in</span> <span style="color:#3300aa">range</span>(<span style="color:#000000">y</span>):
<span style="color:#000000">result</span> <span style="color:#981a1a">+=</span> <span style="color:#000000">y</span>
<span style="color:#3300aa">print</span>(<span style="color:#000000">result</span>)
<span style="color:#770088">return</span> <span style="color:#000000">result</span>
<span style="color:#000000">a</span> <span style="color:#981a1a">=</span> <span style="color:#000000">sum1</span>(<span style="color:#116644">10</span>)
<span style="color:#000000">b</span> <span style="color:#981a1a">=</span> <span style="color:#000000">sum1</span>()</span></span>
运行结果
<span style="background-color:#dadada"><span style="color:#1f0909">100
4</span></span>
位置传参
<span style="background-color:#dadada"><span style="color:#1f0909"><span style="color:#aa5500">#位置传参</span>
<span style="color:#770088">def</span> <span style="color:#0000ff">maxnumber</span>(<span style="color:#000000">x</span>, <span style="color:#000000">y</span>):
<span style="color:#000000">the_max</span> <span style="color:#981a1a">=</span> <span style="color:#000000">x</span> <span style="color:#770088">if</span> <span style="color:#000000">x</span> <span style="color:#981a1a">></span> <span style="color:#000000">y</span> <span style="color:#770088">else</span> <span style="color:#000000">y</span> <span style="color:#aa5500">#简写为一行</span>
<span style="color:#770088">return</span> <span style="color:#000000">the_max</span>
<span style="color:#000000">ret</span> <span style="color:#981a1a">=</span> <span style="color:#000000">maxnumber</span>(<span style="color:#116644">30</span>,<span style="color:#116644">20</span>)
<span style="color:#3300aa">print</span>(<span style="color:#000000">ret</span>)
<span style="color:#aa5500">#关键字传参</span>
<span style="color:#770088">def</span> <span style="color:#0000ff">maxnumber</span>(<span style="color:#000000">x</span>, <span style="color:#000000">y</span>):
<span style="color:#000000">the_max</span> <span style="color:#981a1a">=</span> <span style="color:#000000">x</span> <span style="color:#770088">if</span> <span style="color:#000000">x</span> <span style="color:#981a1a">></span> <span style="color:#000000">y</span> <span style="color:#770088">else</span> <span style="color:#000000">y</span>
<span style="color:#770088">return</span> <span style="color:#000000">the_max</span>
<span style="color:#000000">ret</span> <span style="color:#981a1a">=</span> <span style="color:#000000">maxnumber</span>(<span style="color:#000000">y</span><span style="color:#981a1a">=</span><span style="color:#116644">20</span>,<span style="color:#000000">x</span><span style="color:#981a1a">=</span><span style="color:#116644">10</span>) <span style="color:#aa5500">#给形参赋值,无所谓顺序。一个形参只能赋一个值,否则会报错</span>
<span style="color:#3300aa">print</span>(<span style="color:#000000">ret</span>)</span></span>
运行结果
<span style="background-color:#dadada"><span style="color:#1f0909">30
20</span></span>
混合传参
位置与默认相结合
<span style="background-color:#dadada"><span style="color:#1f0909"><span style="color:#770088">def</span> <span style="color:#0000ff">maxnumber</span>(<span style="color:#000000">x</span>,<span style="color:#000000">y</span>):
<span style="color:#000000">the_max</span> <span style="color:#981a1a">=</span> <span style="color:#000000">x</span> <span style="color:#770088">if</span> <span style="color:#000000">x</span> <span style="color:#981a1a">></span> <span style="color:#000000">y</span> <span style="color:#770088">else</span> <span style="color:#000000">y</span>
<span style="color:#770088">return</span> <span style="color:#000000">the_max</span>
<span style="color:#000000">ret</span> <span style="color:#981a1a">=</span> <span style="color:#000000">maxnumber</span>(<span style="color:#116644">10</span>,<span style="color:#000000">y</span> <span style="color:#981a1a">=</span> <span style="color:#116644">20</span>) <span style="color:#aa5500">#位置参数必须在关键字参数的前面</span>
<span style="color:#3300aa">print</span>(<span style="color:#000000">ret</span>)</span></span>
运行结果
<span style="background-color:#dadada"><span style="color:#1f0909">20</span></span>
默认参数是一种-可变数据类型
<span style="background-color:#dadada"><span style="color:#1f0909"><span style="color:#aa5500">#可变数据类型的默认参数</span>
<span style="color:#770088">def</span> <span style="color:#0000ff">demo</span>(<span style="color:#000000">a</span>,<span style="color:#000000">l</span> <span style="color:#981a1a">=</span> []):
<span style="color:#000000">l</span>.<span style="color:#000000">append</span>(<span style="color:#000000">a</span>)
<span style="color:#3300aa">print</span>(<span style="color:#000000">l</span>)
<span style="color:#000000">demo</span>(<span style="color:#aa1111">'abc'</span>)<span style="color:#aa5500">#第一次</span>
<span style="color:#000000">demo</span>(<span style="color:#aa1111">'123'</span>)<span style="color:#aa5500">#第二次</span>
<span style="color:#000000">demo</span>(<span style="color:#aa1111">'456'</span>)<span style="color:#aa5500">#第三次</span>
<span style="color:#aa5500">#不会清空之前的状态</span>
<span style="color:#aa5500">#空的列表是一个内存地址</span></span></span>
运行结果
<span style="background-color:#dadada"><span style="color:#1f0909">['abc']
['abc', '123']
['abc', '123', '456']</span></span>
动态传参
也叫不定长传参,就是你需要传给函数的参数很多,不定个数,那这种情况下,就用*args,**kwargs接收。
args是元祖形式,接收除去键值对以外的所有参数;
kwargs接收的只是键值对的参数,并保存在字典中。
<span style="background-color:#dadada"><span style="color:#1f0909"><span style="color:#770088">def</span> <span style="color:#0000ff">func</span>(<span style="color:#981a1a">*</span><span style="color:#000000">args</span>):
<span style="color:#3300aa">print</span>(<span style="color:#981a1a">*</span><span style="color:#000000">args</span>)
<span style="color:#770088">def</span> <span style="color:#0000ff">func1</span>(<span style="color:#981a1a">*</span><span style="color:#000000">eagle</span>):
<span style="color:#3300aa">print</span>(<span style="color:#000000">eagle</span>)
<span style="color:#000000">func</span>(<span style="color:#aa1111">'hello'</span>,<span style="color:#aa1111">'world'</span>,<span style="color:#aa1111">'sdsad'</span>)
<span style="color:#000000">func1</span>(<span style="color:#aa1111">'hello'</span>,<span style="color:#aa1111">'world'</span>,<span style="color:#aa1111">'sdsad'</span>)</span></span>
运行结果
<span style="background-color:#dadada"><span style="color:#1f0909">hello world sdsad
('hello', 'world', 'sdsad')</span></span>
动态传参比较大小
<span style="background-color:#dadada"><span style="color:#1f0909"><span style="color:#770088">def</span> <span style="color:#0000ff">my_max</span>(<span style="color:#981a1a">*</span><span style="color:#000000">args</span>):
<span style="color:#000000">max_temp</span> <span style="color:#981a1a">=</span> <span style="color:#116644">0</span>
<span style="color:#3300aa">print</span>(<span style="color:#3300aa">type</span>(<span style="color:#000000">args</span>))
<span style="color:#770088">for</span> <span style="color:#000000">i</span> <span style="color:#770088">in</span> <span style="color:#000000">args</span>:
<span style="color:#770088">if</span> <span style="color:#000000">i</span> <span style="color:#981a1a">></span> <span style="color:#000000">max_temp</span>:
<span style="color:#000000">max_temp</span> <span style="color:#981a1a">=</span> <span style="color:#000000">i</span>
<span style="color:#770088">return</span> <span style="color:#000000">max_temp</span> <span style="color:#aa5500">#注意缩进符号,注意与哪块列对齐,会影响结果</span>
<span style="color:#000000">result</span> <span style="color:#981a1a">=</span> <span style="color:#000000">my_max</span>(<span style="color:#116644">123</span>, <span style="color:#116644">456</span>, <span style="color:#116644">7</span>, <span style="color:#116644">8</span>, <span style="color:#116644">96565</span>, <span style="color:#116644">12</span>, <span style="color:#116644">32</span>, <span style="color:#116644">4567</span>, <span style="color:#116644">123</span>)
<span style="color:#3300aa">print</span>(<span style="color:#000000">result</span>)</span></span>
运行结果
<span style="background-color:#dadada"><span style="color:#1f0909"><class 'tuple'>
96565</span></span>
接收键值对
<span style="background-color:#dadada"><span style="color:#1f0909"><span style="color:#aa5500"># 接收键值对</span>
<span style="color:#770088">def</span> <span style="color:#0000ff">demo</span>(<span style="color:#981a1a">*</span><span style="color:#000000">args</span>, <span style="color:#981a1a">**</span><span style="color:#000000">kwargs</span>):
<span style="color:#3300aa">print</span>(<span style="color:#000000">args</span>, <span style="color:#3300aa">type</span>(<span style="color:#000000">args</span>))
<span style="color:#3300aa">print</span>(<span style="color:#000000">kwargs</span>, <span style="color:#3300aa">type</span>(<span style="color:#000000">kwargs</span>))
<span style="color:#000000">demo</span>(<span style="color:#aa1111">'xiao'</span>, <span style="color:#116644">1</span>, <span style="color:#116644">2</span>, <span style="color:#116644">3</span>, <span style="color:#aa1111">'12r'</span>, [<span style="color:#116644">3</span>, <span style="color:#116644">4</span>, <span style="color:#116644">5</span>], {<span style="color:#aa1111">'name'</span>: <span style="color:#aa1111">"dic"</span>})
<span style="color:#000000">demo</span>(<span style="color:#aa1111">'likou'</span>, <span style="color:#116644">2</span>, <span style="color:#116644">4</span>, [<span style="color:#116644">3</span>, <span style="color:#116644">4</span>, <span style="color:#116644">5</span>], {<span style="color:#aa1111">"dh"</span>: <span style="color:#116644">234</span>, <span style="color:#aa1111">"df"</span>: <span style="color:#116644">494</span>}, <span style="color:#000000">country</span><span style="color:#981a1a">=</span><span style="color:#aa1111">'China'</span>, <span style="color:#000000">b</span><span style="color:#981a1a">=</span><span style="color:#116644">1</span>) <span style="color:#aa5500"># 通过等于号赋值键值对</span></span></span>
运行结果
<span style="background-color:#dadada"><span style="color:#1f0909">('xiao', 1, 2, 3, '12r', [3, 4, 5], {'name': 'dic'}) <class 'tuple'>
{} <class 'dict'>
('likou', 2, 4, [3, 4, 5], {'dh': 234, 'df': 494}) <class 'tuple'>
{'country': 'China', 'b': 1} <class 'dict'></span></span>
命名空间和作用域
代码在运行伊始,创建的存储“变量名与值的关系”的空间叫做全局命名空间; 在函数的运行中开辟的临时的空间叫做局部命名空间。
命名空间
一共分为三种:(由大到小)
-
内置命名空间
-
全局命名空间
-
局部命名空间
取值顺序:
-
在局部调用:局部命名空间->全局命名空间->内置命名空间
-
在全局调用:全局命名空间->内置命名空间(python自带的方法)
作用域
-
全局作用域:包含内置名称空间、全局名称空间,在整个文件的任意位置都能被引用、全局有效
-
局部作用域:局部名称空间,只能在局部范围内生效
globals和locals方法
globals:查全局作用域里面的信息
locals:查局部作用域里面的信息
<span style="background-color:#dadada"><span style="color:#1f0909"><span style="color:#3300aa">print</span>(<span style="color:#000000">glocals</span>)
<span style="color:#3300aa">print</span>(<span style="color:#3300aa">locals</span>)</span></span>
global 关键字
-
声明一个全局变量。
-
在局部作用域想要对全局作用域的全局变量进行修改时,需要用到 global(限于字符串,数字)。
<span style="background-color:#dadada"><span style="color:#1f0909"><span style="color:#000000">a</span> <span style="color:#981a1a">=</span> <span style="color:#116644">1</span>
<span style="color:#3300aa">print</span>(<span style="color:#000000">a</span>)
<span style="color:#770088">def</span> <span style="color:#0000ff">func</span>():
<span style="color:#770088">global</span> <span style="color:#000000">a</span>
<span style="color:#000000">a</span> <span style="color:#981a1a">=</span> <span style="color:#116644">3</span>
<span style="color:#000000">func</span>()
<span style="color:#3300aa">print</span>(<span style="color:#000000">a</span>)</span></span>
运行结果
<span style="background-color:#dadada"><span style="color:#1f0909">1
3</span></span>
对可变数据类型(list,dict,set)可以直接引用不用通过global
<span style="background-color:#dadada"><span style="color:#1f0909"><span style="color:#000000">li</span> <span style="color:#981a1a">=</span> [<span style="color:#116644">1</span>, <span style="color:#116644">2</span>, <span style="color:#116644">3</span>]
<span style="color:#000000">dic</span> <span style="color:#981a1a">=</span> {<span style="color:#aa1111">'name'</span>: <span style="color:#aa1111">'aaron'</span>}
<span style="color:#770088">def</span> <span style="color:#0000ff">change</span>():
<span style="color:#000000">li</span>.<span style="color:#000000">append</span>(<span style="color:#116644">4</span>)
<span style="color:#000000">dic</span>[<span style="color:#aa1111">'age'</span>] <span style="color:#981a1a">=</span> <span style="color:#116644">18</span>
<span style="color:#3300aa">print</span>(<span style="color:#000000">dic</span>)
<span style="color:#3300aa">print</span>(<span style="color:#000000">li</span>)
<span style="color:#000000">change</span>()
<span style="color:#3300aa">print</span>(<span style="color:#000000">dic</span>)
<span style="color:#3300aa">print</span>(<span style="color:#000000">li</span>)
<span style="color:#770088">def</span> <span style="color:#0000ff">change</span>():
<span style="color:#000000">li</span> <span style="color:#981a1a">=</span> [<span style="color:#116644">1</span>, <span style="color:#116644">2</span>, <span style="color:#116644">3</span>]
<span style="color:#000000">li</span>.<span style="color:#000000">append</span>(<span style="color:#116644">4</span>)
<span style="color:#000000">dic</span> <span style="color:#981a1a">=</span> {<span style="color:#aa1111">"name"</span>: <span style="color:#aa1111">"huyang"</span>}
<span style="color:#000000">dic</span>[<span style="color:#aa1111">'age'</span>] <span style="color:#981a1a">=</span> <span style="color:#116644">18</span>
<span style="color:#3300aa">print</span>(<span style="color:#000000">li</span>)
<span style="color:#770088">return</span> <span style="color:#000000">li</span>, <span style="color:#000000">dic</span>
<span style="color:#3300aa">print</span>(<span style="color:#000000">change</span>()) <span style="color:#aa5500"># 多个值返回的是元祖</span>
</span></span>
运行结果
<span style="background-color:#dadada"><span style="color:#1f0909">{'name': 'aaron', 'age': 18}
[1, 2, 3, 4]
{'name': 'aaron', 'age': 18}
[1, 2, 3, 4]
[1, 2, 3, 4]
([1, 2, 3, 4], {'name': 'huyang', 'age': 18})</span></span>
nonlocal
-
不能修改全局变量。
-
在局部作用域中,对父级作用域(或者更外层作用域非全局作用域)的变量进行引用和修改,并且引用的哪层,从那层及以下此变量全部发生改变。(简单来说:在定义后,本层和上一层在之后调用时改变,其他层以及定义前不变不变)
<span style="background-color:#dadada"><span style="color:#1f0909"><span style="color:#770088">def</span> <span style="color:#0000ff">add_b</span>():
<span style="color:#000000">b</span> <span style="color:#981a1a">=</span> <span style="color:#116644">1</span>
<span style="color:#770088">def</span> <span style="color:#0000ff">do_global</span>():
<span style="color:#000000">b</span> <span style="color:#981a1a">=</span> <span style="color:#116644">10</span>
<span style="color:#3300aa">print</span>(<span style="color:#000000">b</span>)
<span style="color:#770088">def</span> <span style="color:#0000ff">dd_nolocal</span>():
<span style="color:#770088">nonlocal</span> <span style="color:#000000">b</span> <span style="color:#aa5500"># 应用了上一层的变量b</span>
<span style="color:#000000">b</span> <span style="color:#981a1a">=</span> <span style="color:#000000">b</span> <span style="color:#981a1a">+</span> <span style="color:#116644">20</span>
<span style="color:#3300aa">print</span>(<span style="color:#000000">b</span>) <span style="color:#aa5500"># 发生了改变</span>
<span style="color:#000000">dd_nolocal</span>() <span style="color:#aa5500"># 调用函数,在nonlocal后do_global的命名空间b也改变了</span>
<span style="color:#3300aa">print</span>(<span style="color:#000000">b</span>)
<span style="color:#000000">do_global</span>()
<span style="color:#3300aa">print</span>(<span style="color:#000000">b</span>)
<span style="color:#000000">add_b</span>() <span style="color:#aa5500"># 最上面一层没有变化</span></span></span>
运行结果
<span style="background-color:#dadada"><span style="color:#1f0909">10
30
30
1</span></span>
函数的嵌套和作用域链
嵌套调用
<span style="background-color:#dadada"><span style="color:#1f0909"><span style="color:#770088">def</span> <span style="color:#0000ff">mymax</span>(<span style="color:#000000">x</span>,<span style="color:#000000">y</span>):
<span style="color:#000000">m</span> <span style="color:#981a1a">=</span> <span style="color:#000000">x</span> <span style="color:#770088">if</span> <span style="color:#000000">x</span> <span style="color:#981a1a">></span> <span style="color:#000000">y</span> <span style="color:#770088">else</span> <span style="color:#000000">y</span>
<span style="color:#770088">return</span> <span style="color:#000000">m</span>
<span style="color:#770088">def</span> <span style="color:#0000ff">maxx</span>(<span style="color:#000000">a</span>,<span style="color:#000000">b</span>,<span style="color:#000000">c</span>,<span style="color:#000000">d</span>):
<span style="color:#000000">res1</span> <span style="color:#981a1a">=</span> <span style="color:#000000">mymax</span>(<span style="color:#000000">a</span>,<span style="color:#000000">b</span>)
<span style="color:#000000">res2</span> <span style="color:#981a1a">=</span> <span style="color:#000000">mymax</span>(<span style="color:#000000">res1</span>,<span style="color:#000000">c</span>)
<span style="color:#000000">res3</span> <span style="color:#981a1a">=</span> <span style="color:#000000">mymax</span>(<span style="color:#000000">res2</span>,<span style="color:#000000">d</span>)
<span style="color:#770088">return</span> <span style="color:#000000">res3</span>
<span style="color:#000000">ret</span> <span style="color:#981a1a">=</span> <span style="color:#000000">maxx</span>(<span style="color:#116644">23</span>,<span style="color:#116644">453</span>,<span style="color:#116644">12</span>,<span style="color:#981a1a">-</span><span style="color:#116644">13</span>)
<span style="color:#3300aa">print</span>(<span style="color:#000000">ret</span>)</span></span>
运行结果
<span style="background-color:#dadada"><span style="color:#1f0909">453</span></span>
嵌套声明
打上断点(pycharm中的红点),进行debug(调试,一步步运行排查)
<span style="background-color:#dadada"><span style="color:#1f0909"><span style="color:#770088">def</span> <span style="color:#0000ff">f1</span>(): <span style="color:#aa5500">#try</span>
<span style="color:#3300aa">print</span>(<span style="color:#aa1111">"in f1"</span>)
<span style="color:#770088">def</span> <span style="color:#0000ff">f2</span>():
<span style="color:#3300aa">print</span>(<span style="color:#aa1111">"in f2"</span>)
<span style="color:#000000">f2</span>()
<span style="color:#000000">f1</span>()</span></span>
函数名的本质
函数名本质上就是函数的内存地址
1.可以被引用
<span style="background-color:#dadada"><span style="color:#1f0909"><span style="color:#770088">def</span> <span style="color:#0000ff">func</span>():
<span style="color:#3300aa">print</span>(<span style="color:#aa1111">'in func'</span>)
<span style="color:#000000">f</span> <span style="color:#981a1a">=</span> <span style="color:#000000">func</span> <span style="color:#aa5500"># 不加括号得到的就是一个地址</span>
<span style="color:#3300aa">print</span>(<span style="color:#000000">f</span>)
<span style="color:#000000">f</span>()</span></span>
运行结果
<span style="background-color:#dadada"><span style="color:#1f0909"><function func at 0x0000023AE51B05E0>
in func</span></span>
2.可以被当作容器类型的元素
<span style="background-color:#dadada"><span style="color:#1f0909"><span style="color:#770088">def</span> <span style="color:#0000ff">f1</span>():
<span style="color:#3300aa">print</span>(<span style="color:#aa1111">'f1'</span>)
<span style="color:#770088">def</span> <span style="color:#0000ff">f2</span>():
<span style="color:#3300aa">print</span>(<span style="color:#aa1111">'f2'</span>)
<span style="color:#770088">def</span> <span style="color:#0000ff">f3</span>():
<span style="color:#3300aa">print</span>(<span style="color:#aa1111">'f3'</span>)
<span style="color:#000000">l</span> <span style="color:#981a1a">=</span> [<span style="color:#000000">f1</span>,<span style="color:#000000">f2</span>,<span style="color:#000000">f3</span>]
<span style="color:#000000">d</span> <span style="color:#981a1a">=</span> {<span style="color:#aa1111">'f1'</span>:<span style="color:#000000">f1</span>,<span style="color:#aa1111">'f2'</span>:<span style="color:#000000">f2</span>,<span style="color:#aa1111">'f3'</span>:<span style="color:#000000">f3</span>}
<span style="color:#aa5500">#调用</span>
<span style="color:#000000">l</span>[<span style="color:#116644">0</span>]()
<span style="color:#000000">d</span>[<span style="color:#aa1111">'f2'</span>]()</span></span>
运行结果
<span style="background-color:#dadada"><span style="color:#1f0909">f1
f2</span></span>
3.可以当作函数的参数和返回值
<span style="background-color:#dadada"><span style="color:#1f0909"><span style="color:#770088">def</span> <span style="color:#0000ff">f1</span>():
<span style="color:#3300aa">print</span>(<span style="color:#aa1111">'f1'</span>)
<span style="color:#770088">def</span> <span style="color:#0000ff">func</span>(<span style="color:#000000">argv</span>):
<span style="color:#000000">argv</span>()
<span style="color:#770088">return</span> <span style="color:#000000">argv</span>
<span style="color:#000000">f</span> <span style="color:#981a1a">=</span> <span style="color:#000000">func</span>(<span style="color:#000000">f1</span>)
<span style="color:#000000">f</span>()</span></span>
运行结果
<span style="background-color:#dadada"><span style="color:#1f0909">f1
f1</span></span>
闭包
<span style="background-color:#dadada"><span style="color:#1f0909"><span style="color:#770088">def</span> <span style="color:#0000ff">func</span>():
<span style="color:#000000">name</span> <span style="color:#981a1a">=</span> <span style="color:#aa1111">'张三'</span>
<span style="color:#770088">def</span> <span style="color:#0000ff">inner</span>():
<span style="color:#3300aa">print</span>(<span style="color:#000000">name</span>)
<span style="color:#770088">return</span> <span style="color:#000000">inner</span>
<span style="color:#000000">f</span> <span style="color:#981a1a">=</span> <span style="color:#000000">func</span>()
<span style="color:#000000">f</span>()</span></span>
内部函数包含对外部作用域*而非*全局作用域变量的引用,该内部函数称为闭包函数
判断闭包函数的方法closure,如下
<span style="background-color:#dadada"><span style="color:#1f0909"><span style="color:#770088">def</span> <span style="color:#0000ff">func</span>():
<span style="color:#000000">name</span> <span style="color:#981a1a">=</span> <span style="color:#aa1111">'huyang'</span>
<span style="color:#770088">def</span> <span style="color:#0000ff">inner</span>():
<span style="color:#3300aa">print</span>(<span style="color:#000000">name</span>)
<span style="color:#3300aa">print</span>(<span style="color:#000000">inner</span>.<span style="color:#000000">__closure__</span>)
<span style="color:#770088">return</span> <span style="color:#000000">inner</span>
<span style="color:#000000">f</span> <span style="color:#981a1a">=</span> <span style="color:#000000">func</span>()
<span style="color:#000000">f</span>()
<span style="color:#aa5500"># 最后运行的结果里面有cell就是闭包</span>
<span style="color:#000000">name</span> <span style="color:#981a1a">=</span> <span style="color:#aa1111">'aaron'</span>
<span style="color:#770088">def</span> <span style="color:#0000ff">func</span>():
<span style="color:#770088">def</span> <span style="color:#0000ff">inner</span>():
<span style="color:#3300aa">print</span>(<span style="color:#000000">name</span>)
<span style="color:#3300aa">print</span>(<span style="color:#000000">inner</span>.<span style="color:#000000">__closure__</span>)
<span style="color:#770088">return</span> <span style="color:#000000">inner</span>
<span style="color:#000000">f</span> <span style="color:#981a1a">=</span> <span style="color:#000000">func</span>()
<span style="color:#000000">f</span>()
<span style="color:#aa5500"># 输出结果为None,说明不是闭包</span></span></span>
<span style="background-color:#dadada"><span style="color:#1f0909"><span style="color:#aa5500"># 你不能在全局作用域里直接读取money name,安全,难以改变</span>
<span style="color:#770088">def</span> <span style="color:#0000ff">wrapper</span>():
<span style="color:#000000">money</span> <span style="color:#981a1a">=</span> <span style="color:#116644">1000</span>
<span style="color:#770088">def</span> <span style="color:#0000ff">func</span>():
<span style="color:#000000">name</span> <span style="color:#981a1a">=</span> <span style="color:#aa1111">'小明'</span>
<span style="color:#770088">def</span> <span style="color:#0000ff">inner</span>():
<span style="color:#3300aa">print</span>(<span style="color:#000000">name</span>,<span style="color:#000000">money</span>)
<span style="color:#770088">return</span> <span style="color:#000000">inner</span>
<span style="color:#770088">return</span> <span style="color:#000000">func</span>
<span style="color:#000000">f</span> <span style="color:#981a1a">=</span> <span style="color:#000000">wrapper</span>()
<span style="color:#000000">i</span> <span style="color:#981a1a">=</span> <span style="color:#000000">f</span>()
<span style="color:#000000">i</span>()</span></span>
运行结果
<span style="background-color:#dadada"><span style="color:#1f0909">小明 1000</span></span>
<span style="background-color:#dadada"><span style="color:#1f0909"><span style="color:#770088">def</span> <span style="color:#0000ff">func</span>(<span style="color:#000000">a</span>,<span style="color:#000000">b</span>):
<span style="color:#770088">def</span> <span style="color:#0000ff">inner</span>(<span style="color:#000000">x</span>):
<span style="color:#770088">return</span> <span style="color:#000000">a</span><span style="color:#981a1a">*</span><span style="color:#000000">x</span> <span style="color:#981a1a">+</span> <span style="color:#000000">b</span>
<span style="color:#770088">return</span> <span style="color:#000000">inner</span>
<span style="color:#000000">func1</span> <span style="color:#981a1a">=</span> <span style="color:#000000">func</span>(<span style="color:#116644">4</span>,<span style="color:#116644">5</span>)
<span style="color:#000000">func2</span> <span style="color:#981a1a">=</span> <span style="color:#000000">func</span>(<span style="color:#116644">7</span>,<span style="color:#116644">8</span>)
<span style="color:#3300aa">print</span>(<span style="color:#000000">func1</span>(<span style="color:#116644">5</span>),<span style="color:#000000">func2</span>(<span style="color:#116644">6</span>))</span></span>
<span style="background-color:#dadada"><span style="color:#1f0909"><span style="color:#770088">from</span> <span style="color:#000000">urllib</span>.<span style="color:#000000">request</span> <span style="color:#770088">import</span> <span style="color:#000000">urlopen</span>
<span style="color:#770088">def</span> <span style="color:#0000ff">func</span>():
<span style="color:#000000">content</span> <span style="color:#981a1a">=</span> <span style="color:#000000">urlopen</span>(<span style="color:#aa1111">'http://myip.ipip.net'</span>).<span style="color:#000000">read</span>()
<span style="color:#770088">def</span> <span style="color:#0000ff">get_content</span>():
<span style="color:#770088">return</span> <span style="color:#000000">content</span>
<span style="color:#770088">return</span> <span style="color:#000000">get_content</span>
<span style="color:#000000">code</span> <span style="color:#981a1a">=</span> <span style="color:#000000">func</span>()
<span style="color:#000000">content</span> <span style="color:#981a1a">=</span> <span style="color:#000000">code</span>()
<span style="color:#3300aa">print</span>(<span style="color:#000000">content</span>.<span style="color:#000000">decode</span>(<span style="color:#aa1111">'utf-8'</span>))
<span style="color:#000000">content2</span> <span style="color:#981a1a">=</span> <span style="color:#000000">code</span>()
<span style="color:#3300aa">print</span>(<span style="color:#000000">content2</span>.<span style="color:#000000">decode</span>(<span style="color:#aa1111">'utf-8'</span>))</span></span>