“自用“Python学习__day2

文章介绍了文件操作的基本流程,包括文本文件和二进制文件的区别,以及如何通过Python代码进行读写操作。重点讲解了文件句柄的打开、读写、关闭过程,以及读取文件内容的不同方法。此外,还阐述了Python中全局与局部作用域的概念,使用global关键字修改全局变量的方法。
摘要由CSDN通过智能技术生成

文件操作基本流程

文本文件和二进制文件

文本文件:可以使用文本编辑器查看;

二进制文件:保存的内容不是直接给人查看的,而是使用专用软件查看的,例如图片文件、视频文件;

操作文件的套路

  1. 打开文件;

  2. 读写文件;

  3. 读文件:将文件内容读入内存;

  4. 写文件:将内存内容写入文件;

  5. 关闭文件;

操作文本文件

<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 关键字

  1. 声明一个全局变量。

  2. 在局部作用域想要对全局作用域的全局变量进行修改时,需要用到 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

  1. 不能修改全局变量。

  2. 在局部作用域中,对父级作用域(或者更外层作用域非全局作用域)的变量进行引用和修改,并且引用的哪层,从那层及以下此变量全部发生改变。(简单来说:在定义后,本层和上一层在之后调用时改变,其他层以及定义前不变不变)

<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>

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值