<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/"
    xmlns:atom="http://www.w3.org/2005/Atom" xmlns:media="http://search.yahoo.com/mrss/" version="2.0">
    <channel>
        
        <title>
            <![CDATA[ ywxgod - freeCodeCamp.org ]]>
        </title>
        <description>
            <![CDATA[ freeCodeCamp 是一个免费学习编程的开发者社区，涵盖 Python、HTML、CSS、React、Vue、BootStrap、JSON 教程等，还有活跃的技术论坛和丰富的社区活动，在你学习编程和找工作时为你提供建议和帮助。 ]]>
        </description>
        <link>https://www.freecodecamp.org/chinese/news/</link>
        <image>
            <url>https://cdn.freecodecamp.org/universal/favicons/favicon.png</url>
            <title>
                <![CDATA[ ywxgod - freeCodeCamp.org ]]>
            </title>
            <link>https://www.freecodecamp.org/chinese/news/</link>
        </image>
        <generator>Eleventy</generator>
        <lastBuildDate>Sat, 09 May 2026 19:14:39 +0000</lastBuildDate>
        <atom:link href="https://www.freecodecamp.org/chinese/news/author/ywxgod/rss.xml" rel="self" type="application/rss+xml" />
        <ttl>60</ttl>
        
            <item>
                <title>
                    <![CDATA[ Python 入门手册——面向初学者的编程教程 ]]>
                </title>
                <description>
                    <![CDATA[ Hi！你是否正在学习 Python？如果是的，那这篇文章就是为你而准备的，在文中你将会找到 Python 语法的详尽描述以及大量的 Python 代码示例，它将会指导你的 Python 编程之旅。 涵盖的内容  * Python 中的变量定义  * Python 中的 Hello, World!  * Python 中的数据类型和内建数据结构  * Python 中的运算符  * Python 中的条件语句  * Python中的 for 循环  * Python中 while 循环  * Python 中的循环嵌套  * Python 中的函数  ]]>
                </description>
                <link>https://www.freecodecamp.org/chinese/news/python-code-examples-sample-script-coding-tutorial-for-beginners/</link>
                <guid isPermaLink="false">60c1732d6a50ee0507a98a90</guid>
                
                    <category>
                        <![CDATA[ Python ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ ywxgod ]]>
                </dc:creator>
                <pubDate>Mon, 01 Nov 2021 10:00:00 +0000</pubDate>
                <media:content url="https://chinese.freecodecamp.org/news/content/images/2021/06/Code-Examples-Image.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <p>Hi！你是否正在学习 Python？如果是的，那这篇文章就是为你而准备的，在文中你将会找到 Python 语法的详尽描述以及大量的 Python 代码示例，它将会指导你的 Python 编程之旅。</p>
<h3 id="">涵盖的内容</h3>
<ul>
<li>Python 中的变量定义</li>
<li>Python 中的 Hello, World!</li>
<li>Python 中的数据类型和内建数据结构</li>
<li>Python 中的运算符</li>
<li>Python 中的条件语句</li>
<li>Python中的 for 循环</li>
<li>Python中 while 循环</li>
<li>Python 中的循环嵌套</li>
<li>Python 中的函数</li>
<li>Python 中的递归</li>
<li>Python 中的异常处理</li>
<li>Python 中的面向对象编程</li>
<li>Python 中如何处理文件</li>
<li>Python 中的导入（import）语句</li>
<li>Python 的列表（List）和字典（Dict）推导</li>
<li>...</li>
</ul>
<p>准备好了吗？让我们开始吧！🔅</p>
<p>💡 <strong>提示：</strong> 在文章中，我会用<code>&lt;&gt;</code>表示这一整块会被其中间的文本描述的元素所取代。例如，<code>&lt;var&gt;</code>表示我们写代码时，它会被一个变量所替换。</p>
<h2 id="python">🔹 Python 中的变量定义</h2>
<p>变量的概念都是任何编程语言中的一个最基本的构件，变量有一个名称和一个内存中用于存储其值的位置。</p>
<p>在 Python 中，我们使用这种语法来创建一个变量并为这个变量赋值：</p>
<pre><code class="language-Python">&lt;var_name&gt; = &lt;value&gt;
</code></pre>
<p>例如：</p>
<pre><code>age = 56
</code></pre>
<pre><code>name = "Nora"
</code></pre>
<pre><code>color = "Blue"
</code></pre>
<pre><code>grades = [67, 100, 87, 56]
</code></pre>
<p>如果变量名不止一个单词，在 <a href="https://www.python.org/dev/peps/pep-0008/">Python 代码的风格指南</a>中的建议是要用下划线将单词分开，“根据需要提高代码的可读性”。</p>
<p>例如：</p>
<pre><code>my_list = [1, 2, 3, 4, 5]
</code></pre>
<p>💡 <strong>提示：</strong> Python 代码风格指南（PEP 8）有很好的建议，你应该遵循这些建议来编写整洁的 Python 代码。</p>
<h2 id="helloworld">🔸 Hello, World!</h2>
<p>在我们开始深入了解 Python 的数据类型与数据结构之前，让我们看看如何编写第一个 Python 程序。</p>
<p>你只需要调用<code>print()</code>函数，并且在括号里写上<code>"Hello, World!"</code>即可：</p>
<pre><code class="language-python">print("Hello, World!")
</code></pre>
<p>程序执行后，你会看到下面的信息：</p>
<pre><code>"Hello, World!"
</code></pre>
<p>💡 <strong>提示：</strong> 写一个<code>"Hello, World!"</code>程序是开发者社区的一个传统。大多数开发者都是从编写这个程序开始学习编程的。</p>
<p>很好，你刚刚写了你的第一个 Python 程序。 现在让我们开始学习 Python 中的数据类型和内建的数据结构。</p>
<h2 id="python">🔹 Python 中的数据类型与内建数据结构</h2>
<p>我们有几种基本的数据类型和内建的数据结构可以使用，每一个都有各自特殊的应用场景，让我们来看看具体的使用细节。</p>
<h3 id="pythonintegersfloatscomplex">Python 中的数字类型：整数（Integers），浮点数（Floats），复数（Complex）</h3>
<p>Python 可以使用的数字类型有下面几种：</p>
<h4 id="">整数</h4>
<p>整数就是没有小数的数字，你可以用<code>type()</code>函数来检查一个数字是否是一个整数。如果<code>type()</code>函数的输出是<code>&lt;class 'int'&gt;</code>，则说明这个数字是一个整数。</p>
<p>例如：</p>
<pre><code class="language-python">&gt;&gt;&gt; type(1)
&lt;class 'int'&gt;

&gt;&gt;&gt; type(15)
&lt;class 'int'&gt;

&gt;&gt;&gt; type(0)
&lt;class 'int'&gt;

&gt;&gt;&gt; type(-46)
&lt;class 'int'&gt;
</code></pre>
<h4 id="">浮点数</h4>
<p>浮点数就是带有小数的数字，你可以通过定位小数点来直观地检测它们。如果我们用<code>type()</code>来检测这些值的类型，你会看到下面这样的输出：</p>
<pre><code>&lt;class 'float'&gt;
</code></pre>
<p>一些例子：</p>
<pre><code class="language-python">&gt;&gt;&gt; type(4.5)
&lt;class 'float'&gt;

&gt;&gt;&gt; type(5.8)
&lt;class 'float'&gt;

&gt;&gt;&gt; type(2342423424.3)
&lt;class 'float'&gt;

&gt;&gt;&gt; type(4.0)
&lt;class 'float'&gt;

&gt;&gt;&gt; type(0.0)
&lt;class 'float'&gt;

&gt;&gt;&gt; type(-23.5)
&lt;class 'float'&gt;
</code></pre>
<h4 id="">复数</h4>
<p>复数有一个实部和一个带有<code>j</code>的虚部。你可以通过<code>complex()</code>来创建复数。<code>complex()</code>的第一个参数是实部，第二个参数是虚部。</p>
<p>一些例子：</p>
<pre><code class="language-python">&gt;&gt;&gt; complex(4, 5)
(4+5j)

&gt;&gt;&gt; complex(6, 8)
(6+8j)

&gt;&gt;&gt; complex(3.4, 3.4)
(3.4+3.4j)

&gt;&gt;&gt; complex(0, 0)
0j

&gt;&gt;&gt; complex(5)
(5+0j)

&gt;&gt;&gt; complex(0, 4)
4j
</code></pre>
<h3 id="python">Python 中的字符串</h3>
<p>Python 中的字符串非常有用，它们包含一连串的字符，通常用于表示代码中的文本。</p>
<p>例如:</p>
<pre><code>"Hello, World!"
</code></pre>
<pre><code>'Hello, World!'
</code></pre>
<p>我们可以使用单引号<code>''</code>或双引号<code>""</code>来定义一个字符串。不管哪一种，它们都是有效的、等同的定义，但在程序中你应该始终保持选择其中的一种。</p>
<p><strong>💡 提示：</strong> 是的！你在写<code>"Hello, World!"</code>程序的时候就已经使用过字符串了。无论何时，当你在 Python 中看到一个被单引号或双引号包围的值时，那它就是一个字符串。</p>
<p>字符串可以包含我们从键盘上输入的任何字符，包括数字、符号和其他特殊字符。</p>
<p>例如：</p>
<pre><code>"45678"
</code></pre>
<pre><code>"my_email@email.com"
</code></pre>
<pre><code>"#IlovePython"
</code></pre>
<p><strong>💡 提示：</strong> 空格也被算作字符串中的字符。</p>
<h4 id="">字符串中的引号</h4>
<p>如果我们用双引号<code>""</code>定义字符串，那我们可以在字符串中使用单引号。例如：</p>
<pre><code>"I'm 20 years old"
</code></pre>
<p>如果我们使用单引号<code>''</code>定义字符串，那我们可以在字符串中使用双引号。例如：</p>
<pre><code>'My favorite book is "Sense and Sensibility"'
</code></pre>
<h4 id="">字符串索引</h4>
<p>在 Python 程序中，我们可以使用索引来访问字符串中的字符。索引是一个整数，表示字符串中的一个特定位置。</p>
<p>下面是字符串<code>"Hello"</code>的图示：</p>
<pre><code>String:  H e l l o
Index:   0 1 2 3 4
</code></pre>
<p><strong>💡 提示：</strong> 索引从<code>0</code>开始，每向右增加一个字符，就增加<code>1</code>。</p>
<p>例如：</p>
<pre><code class="language-python">&gt;&gt;&gt; my_string = "Hello"

&gt;&gt;&gt; my_string[0]
'H'

&gt;&gt;&gt; my_string[1]
'e'

&gt;&gt;&gt; my_string[2]
'l'

&gt;&gt;&gt; my_string[3]
'l'

&gt;&gt;&gt; my_string[4]
'o'
</code></pre>
<p>我们还可以用负的索引来访问字符串中字符：</p>
<pre><code class="language-python">&gt;&gt;&gt; my_string = "Hello"

&gt;&gt;&gt; my_string[-1]
'o'

&gt;&gt;&gt; my_string[-2]
'l'

&gt;&gt;&gt; my_string[-3]
'l'

&gt;&gt;&gt; my_string[-4]
'e'

&gt;&gt;&gt; my_string[-5]
'H'
</code></pre>
<p><strong>💡 提示：</strong> 通常用<code>-1</code>来访问字符串中的最后一个字符。</p>
<h4 id="">字符串切片</h4>
<p>我们可能需要获取字符串的切片或其子集。我们可以使用字符串切片来实现。</p>
<p>切片的一般语法：</p>
<pre><code class="language-python">&lt;string_variable&gt;[start:stop:step]
</code></pre>
<p><code>start</code>是切片中第一个字符的索引，默认值是<code>0</code>。</p>
<ul>
<li><code>stop</code>是切片的最后一个字符的索引（这个字符<strong>并不</strong>包含在切片中），默认值是字符串中的最后一个字符（如果我们省略这个值，最后一个字符也将被包含在内）。</li>
<li><code>step</code>是我们从当前索引到下一个索引所要增加的数量。</li>
</ul>
<p>我们可以指定两个参数，然后第三个参数<code>step</code>使用默认值<code>1</code>，这样就会获取到<code>start</code>到<code>stop</code>(不包含)之间的所有字符：</p>
<pre><code class="language-python">&lt;string_variable&gt;[start:stop]
</code></pre>
<p>例如：</p>
<pre><code class="language-python">&gt;&gt;&gt; freecodecamp = "freeCodeCamp"

&gt;&gt;&gt; freecodecamp[2:8]
'eeCode'

&gt;&gt;&gt; freecodecamp[0:3]
'fre'

&gt;&gt;&gt; freecodecamp[0:4]
'free'

&gt;&gt;&gt; freecodecamp[4:7]
'Cod'

&gt;&gt;&gt; freecodecamp[4:8]
'Code'

&gt;&gt;&gt; freecodecamp[8:11]
'Cam'

&gt;&gt;&gt; freecodecamp[8:12]
'Camp'

&gt;&gt;&gt; freecodecamp[8:13]
'Camp'
</code></pre>
<p><strong>💡 提示：</strong> 注意，如果某个参数值超出了索引的范围，并不会影响切片的展示。这就是 Python 的发明者在考虑如何实现字符串切片功能时所考虑到的。</p>
<p>如果我们给<code>step</code>赋值，我们将会根据这个值从一个索引"跳到"另一个索引。</p>
<p>例如:</p>
<pre><code class="language-python">&gt;&gt;&gt; freecodecamp = "freeCodeCamp"

&gt;&gt;&gt; freecodecamp[0:9:2]
'feCdC'

&gt;&gt;&gt; freecodecamp[2:10:3]
'eoC'

&gt;&gt;&gt; freecodecamp[1:12:4]
'roa'

&gt;&gt;&gt; freecodecamp[4:8:2]
'Cd'

&gt;&gt;&gt; freecodecamp[3:9:2]
'eoe'

&gt;&gt;&gt; freecodecamp[1:10:5]
'rd'
</code></pre>
<p>我们还可以用一个<strong>负的</strong> step 值来从右向左取值：</p>
<pre><code class="language-python">&gt;&gt;&gt; freecodecamp = "freeCodeCamp"

&gt;&gt;&gt; freecodecamp[10:2:-1]
'maCedoCe'

&gt;&gt;&gt; freecodecamp[11:4:-2]
'paeo'

&gt;&gt;&gt; freecodecamp[5:2:-4]
'o'
</code></pre>
<p>并且我们可以省略任意一个参数而使用其默认值。如果我们省略<code>start</code>，<code>stop</code>，或者两者，那么我们只需要一个对应的冒号（<code>:</code>）：</p>
<pre><code class="language-python">&gt;&gt;&gt; freecodecamp = "freeCodeCamp"

# Default start and step
&gt;&gt;&gt; freecodecamp[:8]
'freeCode'

# Default end and step
&gt;&gt;&gt; freecodecamp[4:]
'CodeCamp'

# Default start
&gt;&gt;&gt; freecodecamp[:8:2]
'feCd'

# Default stop
&gt;&gt;&gt; freecodecamp[4::3]
'Cem'

# Default start and stop
&gt;&gt;&gt; freecodecamp[::-2]
'paeoer'

# Default start and stop
&gt;&gt;&gt; freecodecamp[::-1]
'pmaCedoCeerf'
</code></pre>
<p><strong>💡 提示：</strong> 最后的一个是最常用的反转字符串的例子。</p>
<h4 id="f">f-字符串</h4>
<p>在 Python 3.6 或以上版本中，我们可以是使用一种被称为 f-string 的字符串，它能帮助我们处理字符串格式化更加方便。</p>
<p>定义一个 f-string，我们只需要将字符<code>f</code>放到单引号或双引号的前面，然后在字符串里面，我们将变量或者表达式用<code>{}</code>包含起来。当程序执行的时候，它们会被替换为变量或者表达式的值。</p>
<p>例如：</p>
<pre><code class="language-python">first_name = "Nora"
favorite_language = "Python"

print(f"Hi, I'm {first_name}. I'm learning {favorite_language}.")
</code></pre>
<p>输出：</p>
<pre><code>Hi, I'm Nora. I'm learning Python.
</code></pre>
<p>下面我们有一个例子，展示了计算一个表达式的值并将结果替换到字符串中。</p>
<pre><code class="language-python">value = 5

print(f"{value} multiplied by 2 is: {value * 2}")
</code></pre>
<p>它们的值在输出中被替换：</p>
<pre><code class="language-python">5 multiplied by 2 is: 10
</code></pre>
<p>我们还可以在大括号中调用方法，当程序执行后，返回的值会替换掉原字符串中的函数调用：</p>
<pre><code class="language-python">freecodecamp = "FREECODECAMP"

print(f"{freecodecamp.lower()}")
</code></pre>
<p>输出：</p>
<pre><code class="language-python">freecodecamp
</code></pre>
<h4 id="">字符串方法</h4>
<p>字符串的方法，都是被 Python 开发者实现的一些常见的功能，所以我们可以在代码中直接使用它们。这些字符串方法对执行一些常见的操作非常有用。</p>
<p>下面是调用字符串方法的一般语法：</p>
<pre><code class="language-python">&lt;string_variable&gt;.&lt;method_name&gt;(&lt;arguments&gt;)
</code></pre>
<p>例如：</p>
<pre><code class="language-python">&gt;&gt;&gt; freecodecamp = "freeCodeCamp"

&gt;&gt;&gt; freecodecamp.capitalize()
'Freecodecamp'

&gt;&gt;&gt; freecodecamp.count("C")
2

&gt;&gt;&gt; freecodecamp.find("e")
2

&gt;&gt;&gt; freecodecamp.index("p")
11

&gt;&gt;&gt; freecodecamp.isalnum()
True

&gt;&gt;&gt; freecodecamp.isalpha()
True

&gt;&gt;&gt; freecodecamp.isdecimal()
False

&gt;&gt;&gt; freecodecamp.isdigit()
False

&gt;&gt;&gt; freecodecamp.isidentifier()
True

&gt;&gt;&gt; freecodecamp.islower()
False

&gt;&gt;&gt; freecodecamp.isnumeric()
False

&gt;&gt;&gt; freecodecamp.isprintable()
True

&gt;&gt;&gt; freecodecamp.isspace()
False

&gt;&gt;&gt; freecodecamp.istitle()
False

&gt;&gt;&gt; freecodecamp.isupper()
False

&gt;&gt;&gt; freecodecamp.lower()
'freecodecamp'

&gt;&gt;&gt; freecodecamp.lstrip("f")
'reeCodeCamp'

&gt;&gt;&gt; freecodecamp.rstrip("p")
'freeCodeCam'

&gt;&gt;&gt; freecodecamp.replace("e", "a")
'fraaCodaCamp'

&gt;&gt;&gt; freecodecamp.split("C")
['free', 'ode', 'amp']

&gt;&gt;&gt; freecodecamp.swapcase()
'FREEcODEcAMP'

&gt;&gt;&gt; freecodecamp.title()
'Freecodecamp'

&gt;&gt;&gt; freecodecamp.upper()
'FREECODECAMP'
</code></pre>
<p>想了解更多 Python 方法，建议去 Python 官方网站阅读<a href="https://docs.python.org/3/library/stdtypes.html#string-methods">这篇</a>。</p>
<p>💡 <strong>提示：</strong> 所有字符串方法返回的都是一个字符串的副本。它们不会对原始字符串做修改，因为在 Python 中字符串时不可修改的.</p>
<h3 id="python">Python中的布尔类型</h3>
<p>Python 中布尔类型的值就只有<code>True</code>和<code>False</code>。它们必须已大写字母开头，这样 Python 才能识别到是布尔类型的值。</p>
<p>例如：</p>
<pre><code class="language-python">&gt;&gt;&gt; type(True)
&lt;class 'bool'&gt;

&gt;&gt;&gt; type(False)
&lt;class 'bool'&gt;
</code></pre>
<p>如果写成了小写，会报错：</p>
<pre><code class="language-python">&gt;&gt;&gt; type(true)
Traceback (most recent call last):
  File "&lt;pyshell#92&gt;", line 1, in &lt;module&gt;
    type(true)
NameError: name 'true' is not defined

&gt;&gt;&gt; type(false)
Traceback (most recent call last):
  File "&lt;pyshell#93&gt;", line 1, in &lt;module&gt;
    type(false)
NameError: name 'false' is not defined
</code></pre>
<h3 id="python">Python 中的列表</h3>
<p>到此我们已经说完了 Python 的基本数据类型，现在我们来看看内置的数据结构。首先，来看列表。</p>
<p>定义列表，我们要用中括号<code>[]</code>，然后中括号里面是用逗号分隔的元素。</p>
<p><strong>💡 提示：</strong> 建议在每个逗号后面加一个空格，以增加代码的可读性。</p>
<p>例如，下面是一些列表的例子：</p>
<pre><code>[1, 2, 3, 4, 5]
</code></pre>
<pre><code>["a", "b", "c", "d"]
</code></pre>
<pre><code>[3.4, 2.4, 2.6, 3.5]
</code></pre>
<p>列表可以包含不同类型的数据，所以下面是一个合法的列表：</p>
<pre><code>[1, "Emily", 3.4]
</code></pre>
<p>我们还可以将一个列表赋值给一个变量：</p>
<pre><code class="language-python">my_list = [1, 2, 3, 4, 5]
</code></pre>
<pre><code class="language-python">letters = ["a", "b", "c", "d"]
</code></pre>
<h4 id="">列表嵌套</h4>
<p>列表可以包含任何类型的数据，甚至包含其他的列表。这些被包含在内部的列表叫做<strong>嵌套列表</strong>。</p>
<pre><code class="language-python">[[1, 2, 3], [4, 5, 6]]
</code></pre>
<p>上面的例子, <code>[1, 2, 3]</code>与<code>[4, 5, 6]</code>是两个嵌套的列表。</p>
<p>再看看另外一个有效的例子：</p>
<pre><code class="language-python">[["a", "b", "c"], ["d", "e", "f"], ["g", "h", "i"]]
</code></pre>
<pre><code class="language-python">[1, [2, 3, 4], [5, 6, 7], 3.4]
</code></pre>
<p>我们可以使用相应的索引来访问嵌套的列表：</p>
<pre><code class="language-python">&gt;&gt;&gt; my_list = [[1, 2, 3], [4, 5, 6]]

&gt;&gt;&gt; my_list[0]
[1, 2, 3]

&gt;&gt;&gt; my_list[1]
[4, 5, 6]
</code></pre>
<p>嵌套列表可以用于表示简单 2D 游戏板的结构，其中每个数字可以表示不同的元素或图块：</p>
<pre><code class="language-python"># Sample Board where: 
# 0 = Empty tile
# 1 = Coin
# 2 = Enemy
# 3 = Goal
board = [[0, 0, 1],
         [0, 2, 0],
         [1, 0, 3]]
</code></pre>
<h4 id="">列表的长度</h4>
<p>我们可以用<code>len()</code>方法来获取列表的长度（包含的元素的个数）。</p>
<p>例如：</p>
<pre><code class="language-python">&gt;&gt;&gt; my_list = [1, 2, 3, 4]

&gt;&gt;&gt; len(my_list)
4
</code></pre>
<h4 id="">更新列表中的元素</h4>
<p>更新列表中某个索引出的值，可以用下面的语法：</p>
<pre><code class="language-python">&lt;list_variable&gt;[&lt;index&gt;] = &lt;value&gt;
</code></pre>
<p>例如：</p>
<pre><code class="language-python">&gt;&gt;&gt; letters = ["a", "b", "c", "d"]

&gt;&gt;&gt; letters[0] = "z"

&gt;&gt;&gt; letters
['z', 'b', 'c', 'd']
</code></pre>
<h4 id="">向列表中添加一个值</h4>
<p>我们可以用<code>.append()</code>方法向列表的尾部添加一个值。</p>
<p>例如：</p>
<pre><code class="language-python">&gt;&gt;&gt; my_list = [1, 2, 3, 4]

&gt;&gt;&gt; my_list.append(5)

&gt;&gt;&gt; my_list
[1, 2, 3, 4, 5]
</code></pre>
<h4 id="">从列表中删除一个值</h4>
<p>我们可以使用<code>.remove()</code>方法从列表中删除一个值。</p>
<p>例如：</p>
<pre><code class="language-python">&gt;&gt;&gt; my_list = [1, 2, 3, 4]

&gt;&gt;&gt; my_list.remove(3)

&gt;&gt;&gt; my_list
[1, 2, 4]
</code></pre>
<p>💡 <strong>提示：</strong> 这个方法只会删除找到的第一个元素。例如，假设我们想从列表中删除数字 3，但列表中包含两个 3，那么第二个 3 将不会被删除。</p>
<pre><code class="language-python">&gt;&gt;&gt; my_list = [1, 2, 3, 3, 4]

&gt;&gt;&gt; my_list.remove(3)

&gt;&gt;&gt; my_list
[1, 2, 3, 4]
</code></pre>
<h4 id="">列表索引</h4>
<p>列表索引跟字符串的索引一样，也是从<code>0</code>开始的：</p>
<pre><code class="language-python">&gt;&gt;&gt; letters = ["a", "b", "c", "d"]

&gt;&gt;&gt; letters[0]
'a'

&gt;&gt;&gt; letters[1]
'b'

&gt;&gt;&gt; letters[2]
'c'

&gt;&gt;&gt; letters[3]
'd'
</code></pre>
<h4 id="">列表切片</h4>
<p>我们还可以使用跟字符串切片相同的语法来处理列表的切片，包括省略参数来使用索引的默认值。现在，我们要做的是向列表中添加元素，而不是向字符串切片中添加字符了。</p>
<pre><code class="language-python">&lt;list_variable&gt;[start:stop:step]
</code></pre>
<p>例如：</p>
<pre><code class="language-python">&gt;&gt;&gt; my_list = ["a", "b", "c", "d", "e", "f", "g", "h", "i"]

&gt;&gt;&gt; my_list[2:6:2]
['c', 'e']

&gt;&gt;&gt; my_list[2:8]
['c', 'd', 'e', 'f', 'g', 'h']

&gt;&gt;&gt; my_list[1:10]
['b', 'c', 'd', 'e', 'f', 'g', 'h', 'i']

&gt;&gt;&gt; my_list[4:8:2]
['e', 'g']

&gt;&gt;&gt; my_list[::-1]
['i', 'h', 'g', 'f', 'e', 'd', 'c', 'b', 'a']

&gt;&gt;&gt; my_list[::-2]
['i', 'g', 'e', 'c', 'a']

&gt;&gt;&gt; my_list[8:1:-1]
['i', 'h', 'g', 'f', 'e', 'd', 'c']
</code></pre>
<h4 id="">列表方法</h4>
<p>Python 同样也实现了一些常用的列表方法，供我们处理一些常用的操作。下面是一些常用列表方法的使用示例：</p>
<pre><code class="language-python">&gt;&gt;&gt; my_list = [1, 2, 3, 3, 4]

&gt;&gt;&gt; my_list.append(5)
&gt;&gt;&gt; my_list
[1, 2, 3, 3, 4, 5]

&gt;&gt;&gt; my_list.extend([6, 7, 8])
&gt;&gt;&gt; my_list
[1, 2, 3, 3, 4, 5, 6, 7, 8]

&gt;&gt;&gt; my_list.insert(2, 15)
&gt;&gt;&gt; my_list
[1, 2, 15, 3, 3, 4, 5, 6, 7, 8, 2, 2]

&gt;&gt;&gt; my_list.remove(2)
&gt;&gt;&gt; my_list
[1, 15, 3, 3, 4, 5, 6, 7, 8, 2, 2]

&gt;&gt;&gt; my_list.pop()
2

&gt;&gt;&gt; my_list.index(6)
6

&gt;&gt;&gt; my_list.count(2)
1

&gt;&gt;&gt; my_list.sort()
&gt;&gt;&gt; my_list
[1, 2, 3, 3, 4, 5, 6, 7, 8, 15]

&gt;&gt;&gt; my_list.reverse()
&gt;&gt;&gt; my_list
[15, 8, 7, 6, 5, 4, 3, 3, 2, 1]

&gt;&gt;&gt; my_list.clear()
&gt;&gt;&gt; my_list
[]
</code></pre>
<p>想了解更多列表方法，建议去 Python 官网阅读<a href="https://docs.python.org/3/tutorial/datastructures.html#more-on-lists">这篇</a>。</p>
<h3 id="python">Python中的元组</h3>
<p>定义元组，我们使用小括号<code>()</code>，然后小括号里面的元素用逗号分隔。建议在每个逗号后面加一个空格，以增加代码的可读性。</p>
<pre><code class="language-python">(1, 2, 3, 4, 5)
</code></pre>
<pre><code class="language-python">("a", "b", "c", "d")
</code></pre>
<pre><code class="language-python">(3.4, 2.4, 2.6, 3.5)
</code></pre>
<p>我们可以将元组赋值给一个变量：</p>
<pre><code class="language-python">my_tuple = (1, 2, 3, 4, 5)
</code></pre>
<h4 id="">元组的索引</h4>
<p>我们可以通过元组的索引来访问它的元素：</p>
<pre><code class="language-python">&gt;&gt;&gt; my_tuple = (1, 2, 3, 4)

&gt;&gt;&gt; my_tuple[0]
1

&gt;&gt;&gt; my_tuple[1]
2

&gt;&gt;&gt; my_tuple[2]
3

&gt;&gt;&gt; my_tuple[3]
4
</code></pre>
<p>我们同样可以使用负的索引：</p>
<pre><code class="language-python">&gt;&gt;&gt; my_tuple = (1, 2, 3, 4)

&gt;&gt;&gt; my_tuple[-1]
4

&gt;&gt;&gt; my_tuple[-2]
3

&gt;&gt;&gt; my_tuple[-3]
2

&gt;&gt;&gt; my_tuple[-4]
1
</code></pre>
<h4 id="">元组长度</h4>
<p>为了获取元组的长度，我们可以将元组本身传入<code>len()</code>函数：</p>
<pre><code class="language-python">&gt;&gt;&gt; my_tuple = (1, 2, 3, 4)

&gt;&gt;&gt; len(my_tuple)
4
</code></pre>
<h4 id="">嵌套元组</h4>
<p>元组可以包含任意数据类型，包括列表和其他的元组。这些包含在里面的元组被称为<strong>嵌套元组</strong>。</p>
<pre><code class="language-python">([1, 2, 3], (4, 5, 6))
</code></pre>
<p>下面的例子，我们有一个被嵌套的元组<code>(4, 5, 6)</code>和一个列表。你可以通过它们相应的索引来访问它们。</p>
<p>例如：</p>
<pre><code class="language-python">&gt;&gt;&gt; my_tuple = ([1, 2, 3], (4, 5, 6))

&gt;&gt;&gt; my_tuple[0]
[1, 2, 3]

&gt;&gt;&gt; my_tuple[1]
(4, 5, 6)
</code></pre>
<h4 id="">元组切片</h4>
<p>对元组进行切片操作，就像列表和字符串一样，都是相同的原理与规则。</p>
<p>下面是一般的语法：</p>
<pre><code class="language-python">&lt;tuple_variable&gt;[start:stop:step]
</code></pre>
<p>例如：</p>
<pre><code class="language-python">&gt;&gt;&gt; my_tuple = (4, 5, 6, 7, 8, 9, 10)

&gt;&gt;&gt; my_tuple[3:8]
(7, 8, 9, 10)

&gt;&gt;&gt; my_tuple[2:9:2]
(6, 8, 10)

&gt;&gt;&gt; my_tuple[:8]
(4, 5, 6, 7, 8, 9, 10)

&gt;&gt;&gt; my_tuple[:6]
(4, 5, 6, 7, 8, 9)

&gt;&gt;&gt; my_tuple[:4]
(4, 5, 6, 7)

&gt;&gt;&gt; my_tuple[3:]
(7, 8, 9, 10)

&gt;&gt;&gt; my_tuple[2:5:2]
(6, 8)

&gt;&gt;&gt; my_tuple[::2]
(4, 6, 8, 10)

&gt;&gt;&gt; my_tuple[::-1]
(10, 9, 8, 7, 6, 5, 4)

&gt;&gt;&gt; my_tuple[4:1:-1]
(8, 7, 6)
</code></pre>
<h4 id="">元组方法</h4>
<p>元组有两个内建的方法：</p>
<pre><code class="language-python">&gt;&gt;&gt; my_tuple = (4, 4, 5, 6, 6, 7, 8, 9, 10)

&gt;&gt;&gt; my_tuple.count(6)
2

&gt;&gt;&gt; my_tuple.index(7)
5
</code></pre>
<p>💡 <strong>提示：</strong> 元组是不可变的，不可被修改，所以我们不能向元组中添加、更新、删除元素。如果你确实需要修改元组的元素，我们可以将其复制一份。</p>
<h4 id="">元组解包</h4>
<p>Python 中有一个很酷的功能叫做元组解包。利用解包操作，我们可以在一行同时向多个变量赋值。</p>
<p>这些值会根据其出现的顺序被赋给相对应的变量。例如，<code>a, b = 1, 2</code>中的值<code>1</code>会被赋给变量<code>a</code>，<code>2</code>会被赋给变量<code>b</code>。</p>
<p>例如：</p>
<pre><code class="language-python"># Tuple Assignment
&gt;&gt;&gt; a, b = 1, 2

&gt;&gt;&gt; a
1

&gt;&gt;&gt; b
2
</code></pre>
<p><strong>💡 提示：</strong> 元组解包常被用于交换两个变量的值：</p>
<pre><code class="language-python">&gt;&gt;&gt; a = 1

&gt;&gt;&gt; b = 2

# Swap the values
&gt;&gt;&gt; a, b = b, a

&gt;&gt;&gt; a
2

&gt;&gt;&gt; b
1
</code></pre>
<h3 id="python">Python 中的字典</h3>
<p>现在让我们开始深入字典类型。字典类型允许我们创建值对，一个值关联另外一个值。</p>
<p>定义字典，我们通常使用大括号<code>{}</code>，大括号里面是用逗号分隔的键-值对。</p>
<p>键与值之间用冒号<code>:</code>分隔，像这样：</p>
<pre><code class="language-python">{"a": 1, "b": 2, "c"; 3}
</code></pre>
<p>你可以将字典赋给一个变量：</p>
<pre><code class="language-python">my_dict = {"a": 1, "b": 2, "c"; 3}
</code></pre>
<p>字典的键必须是一种不可变的数据类型。例如，它们可以是字符串、数字和元组，但不能是列表，因为列表时可变的类型。</p>
<ul>
<li>字符串类型的键: <code>{"City 1": 456, "City 2": 577, "City 3": 678}</code></li>
<li>数字类型的键: <code>{1: "Move Left", 2: "Move Right", 3: "Move Up", 4: "Move Down"}</code></li>
<li>元组类型的键: <code>{(0, 0): "Start", (2, 4): "Goal"}</code></li>
</ul>
<p>字典的值可以是任意数据类型，所以它可以被赋值为字符串、数字、列表、元组、集合，甚至其他字典也可以作为它的值。下面是一些例子：</p>
<pre><code>{"product_id": 4556, "ingredients": ["tomato", "cheese", "mushrooms"], "price": 10.67}
</code></pre>
<pre><code class="language-python">{"product_id": 4556, "ingredients": ("tomato", "cheese", "mushrooms"), "price": 10.67}
</code></pre>
<pre><code class="language-python">{"id": 567, "name": "Emily", "grades": {"Mathematics": 80, "Biology": 74, "English": 97}}
</code></pre>
<h4 id="">字典的长度</h4>
<p>我们可以调用<code>len()</code>方法来获取键-值对的个数：</p>
<pre><code class="language-python">&gt;&gt;&gt; my_dict = {"a": 1, "b": 2, "c": 3, "d": 4}

&gt;&gt;&gt; len(my_dict)
4
</code></pre>
<h4 id="">从字典中获取一个值</h4>
<p>要从字典中获取一个值，我们可以利用它的键，语法如下：</p>
<pre><code class="language-python">&lt;variable_with_dictionary&gt;[&lt;key&gt;]
</code></pre>
<p>上面的表达式将会被 key（键）对应的值所替换。</p>
<p>例如：</p>
<pre><code class="language-python">my_dict = {"a": 1, "b": 2, "c": 3, "d": 4}

print(my_dict["a"])
</code></pre>
<p>输出的是<code>"a"</code>关联的值：</p>
<pre><code>1
</code></pre>
<h4 id="">更新字典中的一个值</h4>
<p>要更新一个已存在的键对应的值，跟获取键的值类似，只是我们需要在后面增加一个值的赋值操作：</p>
<pre><code class="language-python">&lt;variable_with_dictionary&gt;[&lt;key&gt;] = &lt;value&gt;
</code></pre>
<p>例如：</p>
<pre><code>&gt;&gt;&gt; my_dict = {"a": 1, "b": 2, "c": 3, "d": 4}

&gt;&gt;&gt; my_dict["b"] = 6
</code></pre>
<p>现在字典是这样子了：</p>
<pre><code class="language-python">{'a': 1, 'b': 6, 'c': 3, 'd': 4}
</code></pre>
<h4 id="">向字典中增加一个键-值对</h4>
<p>字典的键需要是唯一的。要添加键值对，我们可以使用跟更新值相同的语法，不过只是使用一个新的键而已。</p>
<pre><code class="language-python">&lt;variable_with_dictionary&gt;[&lt;new_key&gt;] = &lt;value&gt;
</code></pre>
<p>例如：</p>
<pre><code class="language-python">&gt;&gt;&gt; my_dict = {"a": 1, "b": 2, "c": 3, "d": 4}

&gt;&gt;&gt; my_dict["e"] = 5
</code></pre>
<p>现在我们的字典有了一个新的键-值对：</p>
<pre><code class="language-python">{'a': 1, 'b': 2, 'c': 3, 'd': 4, 'e': 5}
</code></pre>
<h4 id="">从字典中删除键-值对</h4>
<p>我们可以使用<code>del</code>语句来删除字典中的键-值对：</p>
<pre><code class="language-python">del &lt;dictionary_variable&gt;[&lt;key&gt;]
</code></pre>
<p>例如：</p>
<pre><code class="language-python">&gt;&gt;&gt; my_dict = {"a": 1, "b": 2, "c": 3, "d": 4}

&gt;&gt;&gt; del my_dict["c"]
</code></pre>
<p>现在的字典如下：</p>
<pre><code class="language-python">{'a': 1, 'b': 2, 'd': 4}
</code></pre>
<h4 id="">字典的方法</h4>
<p>下面是一些字典常用方法的使用示例：</p>
<pre><code class="language-python">&gt;&gt;&gt; my_dict = {"a": 1, "b": 2, "c": 3, "d": 4}

&gt;&gt;&gt; my_dict.get("c")
3

&gt;&gt;&gt; my_dict.items()
dict_items([('a', 1), ('b', 2), ('c', 3), ('d', 4)])

&gt;&gt;&gt; my_dict.keys()
dict_keys(['a', 'b', 'c', 'd'])

&gt;&gt;&gt; my_dict.pop("d")
4

&gt;&gt;&gt; my_dict.popitem()
('c', 3)

&gt;&gt;&gt; my_dict.setdefault("a", 15)
1

&gt;&gt;&gt; my_dict
{'a': 1, 'b': 2}

&gt;&gt;&gt; my_dict.setdefault("f", 25)
25

&gt;&gt;&gt; my_dict
{'a': 1, 'b': 2, 'f': 25}

&gt;&gt;&gt; my_dict.update({"c": 3, "d": 4, "e": 5})

&gt;&gt;&gt; my_dict.values()
dict_values([1, 2, 25, 3, 4, 5])

&gt;&gt;&gt; my_dict.clear()

&gt;&gt;&gt; my_dict
{}
</code></pre>
<p>想了解更多字典的方法，建议去 Python 的官网<a href="https://docs.python.org/3/library/stdtypes.html#mapping-types-dict">读这篇</a>。</p>
<h2 id="python">🔸 Python 中的运算符</h2>
<p>很好，现在我们已经知道了 Python 中的基本数据类型与内建的数据结构，那么接下来我们来深入了解一下 Python 中的运算符，它们对于执行一些操作和构建表达式至关重要。</p>
<h3 id="python">Python中的算法运算符</h3>
<p>算术运算符有以下这些：</p>
<h4 id="">加法运算: +</h4>
<pre><code class="language-python">&gt;&gt;&gt; 5 + 6
11

&gt;&gt;&gt; 0 + 6
6

&gt;&gt;&gt; 3.4 + 5.7
9.1

&gt;&gt;&gt; "Hello" + ", " + "World"
'Hello, World'

&gt;&gt;&gt; True + False
1
</code></pre>
<p>💡 <strong>提示：</strong> 最后的两个示例有些奇怪，是吗？运算符的行为会根据操作数类型的不同而不同。</p>
<p>当它们都是字符串的时候，该操作符会将字符串相连。当它们是布尔值时，它将执行一个特定的操作。</p>
<p>在Python中，<code>True</code>等于<code>1</code>，<code>False</code>等于<code>0</code>。这就是为什么<code>1 + 0 = 1</code>的原因。</p>
<h4 id="">减法运算: -</h4>
<pre><code class="language-python">&gt;&gt;&gt; 5 - 6
-1

&gt;&gt;&gt; 10 - 3
7

&gt;&gt;&gt; 5 - 6
-1

&gt;&gt;&gt; 4.5 - 5.6 - 2.3
-3.3999999999999995

&gt;&gt;&gt; 4.5 - 7
-2.5

&gt;&gt;&gt; - 7.8 - 6.2
-14.0
</code></pre>
<h4 id="">乘法运算: *</h4>
<pre><code class="language-python">&gt;&gt;&gt; 5 * 6
30

&gt;&gt;&gt; 6 * 7
42

&gt;&gt;&gt; 10 * 100
1000

&gt;&gt;&gt; 4 * 0
0

&gt;&gt;&gt; 3.4 *6.8
23.119999999999997

&gt;&gt;&gt; 4 * (-6)
-24

&gt;&gt;&gt; (-6) * (-8)
48

&gt;&gt;&gt; "Hello" * 4
'HelloHelloHelloHello'

&gt;&gt;&gt; "Hello" * 0
''

&gt;&gt;&gt; "Hello" * -1
''
</code></pre>
<p><strong>💡 提示：</strong> 你可以用一个数字与一个字符串“相乘”，结果会让字符串重复与相乘的这个数字相同的次数。</p>
<h4 id="">指数运算: **</h4>
<pre><code class="language-python">&gt;&gt;&gt; 6 ** 8
1679616

&gt;&gt;&gt; 5 ** 2
25

&gt;&gt;&gt; 4 ** 0
1

&gt;&gt;&gt; 16 ** (1/2)
4.0

&gt;&gt;&gt; 16 ** (0.5)
4.0

&gt;&gt;&gt; 125 ** (1/3)
4.999999999999999

&gt;&gt;&gt; 4.5 ** 2.3
31.7971929089206

&gt;&gt;&gt; 3 ** (-1)
0.3333333333333333
</code></pre>
<h4 id="">除法运算: /</h4>
<pre><code class="language-python">&gt;&gt;&gt; 25 / 5
5.0

&gt;&gt;&gt; 3 / 6
0.5

&gt;&gt;&gt; 0 / 5
0.0

&gt;&gt;&gt; 2467 / 4673
0.5279263856195163

&gt;&gt;&gt; 1 / 2
0.5

&gt;&gt;&gt; 4.5 / 3.5
1.2857142857142858

&gt;&gt;&gt; 6 / 7
0.8571428571428571

&gt;&gt;&gt; -3 / -4
0.75

&gt;&gt;&gt; 3 / -4
-0.75

&gt;&gt;&gt; -3 / 4
-0.75
</code></pre>
<p>💡 <strong>提示：</strong> 该运算会返回一个<code>float</code>类型的结果，即时数字的小数部分是<code>.0</code>。</p>
<p>如果你尝试除<code>0</code>，你将会得到一个<code>ZeroDivisionError</code>错误：</p>
<pre><code class="language-python">&gt;&gt;&gt; 5 / 0
Traceback (most recent call last):
  File "&lt;pyshell#109&gt;", line 1, in &lt;module&gt;
    5 / 0
ZeroDivisionError: division by zero
</code></pre>
<h4 id="">整除运算: //</h4>
<p>如果操作数是整数，结果将会是整数。如果操作数是浮点数，结果将会是一个带<code>.0</code>的浮点数，因为小数部分会被截断。</p>
<pre><code class="language-python">&gt;&gt;&gt; 5 // 6
0

&gt;&gt;&gt; 8 // 2
4

&gt;&gt;&gt; -4 // -5
0

&gt;&gt;&gt; -5 // 8
-1

&gt;&gt;&gt; 0 // 5
0

&gt;&gt;&gt; 156773 // 356
440
</code></pre>
<h4 id="">模运算: %</h4>
<pre><code>&gt;&gt;&gt; 1 % 5
1

&gt;&gt;&gt; 2 % 5
2

&gt;&gt;&gt; 3 % 5
3

&gt;&gt;&gt; 4 % 5
4

&gt;&gt;&gt; 5 % 5
0

&gt;&gt;&gt; 5 % 8
5

&gt;&gt;&gt; 3 % 1
0

&gt;&gt;&gt; 15 % 3
0

&gt;&gt;&gt; 17 % 8
1

&gt;&gt;&gt; 2568 % 4
0

&gt;&gt;&gt; 245 % 15
5

&gt;&gt;&gt; 0 % 6
0

&gt;&gt;&gt; 3.5 % 2.4
1.1

&gt;&gt;&gt; 6.7 % -7.8
-1.0999999999999996

&gt;&gt;&gt; 2.3 % 7.5
2.3
</code></pre>
<h4 id="">比较操作符</h4>
<p>有以下几种比较操作：</p>
<ul>
<li>大于: <code>&gt;</code></li>
<li>大于等于: <code>&gt;=</code></li>
<li>小于: <code>&lt;</code></li>
<li>小于等于: <code>&lt;=</code></li>
<li>等于: <code>==</code></li>
<li>不等于: <code>!=</code></li>
</ul>
<p>这些比较运算符使表达式的计算结果为<code>True</code>或<code>False</code>。下面是一些例子：</p>
<pre><code>&gt;&gt;&gt; 5 &gt; 6
False

&gt;&gt;&gt; 10 &gt; 8
True

&gt;&gt;&gt; 8 &gt; 8
False

&gt;&gt;&gt; 8 &gt;= 5
True

&gt;&gt;&gt; 8 &gt;= 8
True

&gt;&gt;&gt; 5 &lt; 6
True

&gt;&gt;&gt; 10 &lt; 8
False

&gt;&gt;&gt; 8 &lt; 8
False

&gt;&gt;&gt; 8 &lt;= 5
False

&gt;&gt;&gt; 8 &lt;= 8
True

&gt;&gt;&gt; 8 &lt;= 10
True

&gt;&gt;&gt; 56 == 56
True

&gt;&gt;&gt; 56 == 78
False

&gt;&gt;&gt; 34 != 59
True

&gt;&gt;&gt; 67 != 67
False
</code></pre>
<p>我们还可以使用它们根据字母顺序来比较字符串：</p>
<pre><code class="language-python">&gt;&gt;&gt; "Hello" &gt; "World"
False
&gt;&gt;&gt; "Hello" &gt;= "World"
False
&gt;&gt;&gt; "Hello" &lt; "World"
True
&gt;&gt;&gt; "Hello" &lt;= "World"
True
&gt;&gt;&gt; "Hello" == "World"
False
&gt;&gt;&gt; "Hello" != "World"
True
</code></pre>
<p>我们通常使用它们来比较两个或多个变量的值：</p>
<pre><code class="language-python">&gt;&gt;&gt; a = 1
&gt;&gt;&gt; b = 2

&gt;&gt;&gt; a &lt; b
True

&gt;&gt;&gt; a &lt;= b
True

&gt;&gt;&gt; a &gt; b
False

&gt;&gt;&gt; a &gt;= b
False

&gt;&gt;&gt; a == b
False

&gt;&gt;&gt; a != b
True
</code></pre>
<p>💡 <strong>提示：</strong> 注意，比较运算符是<code>==</code>，而赋值运算符是<code>=</code>。它们的效果是不一样的。<code>==</code>返回<code>True</code>或<code>False</code>而<code>=</code>是将值赋值给变量。</p>
<h4 id="">链式比较运算符</h4>
<p>在 Python 中，我们可以使用被称为“比较运算符链”的功能，这种链接比较可以让我们更简洁的进行多个表达式的比较。</p>
<p>例如，下面的语句时检查<code>a</code>是否小于<code>b</code>且<code>b</code>是否又小于<code>c</code>：</p>
<pre><code>a &lt; b &lt; c
</code></pre>
<p>下面是一些例子：</p>
<pre><code>&gt;&gt;&gt; a = 1
&gt;&gt;&gt; b = 2
&gt;&gt;&gt; c = 3

&gt;&gt;&gt; a &lt; b &lt; c
True

&gt;&gt;&gt; a &gt; b &gt; c
False

&gt;&gt;&gt; a &lt;= b &lt;= c
True

&gt;&gt;&gt; a &gt;= b &gt;= c
False

&gt;&gt;&gt; a &gt;= b &gt; c
False

&gt;&gt;&gt; a &lt;= b &lt; c
True
</code></pre>
<h4 id="">逻辑运算符</h4>
<p>Python 中有三种逻辑运算符：<code>与</code>，<code>或</code>，与<code>非</code>。这些运算符中的每一个都有自己的真值表，它们对于处理条件语句至关重要。</p>
<p><code>与</code>运算：</p>
<pre><code class="language-python">&gt;&gt;&gt; True and True
True

&gt;&gt;&gt; True and False
False

&gt;&gt;&gt; False and True
False

&gt;&gt;&gt; False and False
False
</code></pre>
<p><code>或</code>运算：</p>
<pre><code class="language-python">&gt;&gt;&gt; True or True
True

&gt;&gt;&gt; True or False
True

&gt;&gt;&gt; False or True
True

&gt;&gt;&gt; False or False
False
</code></pre>
<p><code>非</code>运算：</p>
<pre><code class="language-python">&gt;&gt;&gt; not True
False

&gt;&gt;&gt; not False
True
</code></pre>
<p>这些逻辑运算符结合不同的其他运算符或变量，来产生更复杂的表达式：</p>
<p>例如：</p>
<pre><code class="language-python">&gt;&gt;&gt; a = 6
&gt;&gt;&gt; b = 3

&gt;&gt;&gt; a &lt; 6 or b &gt; 2
True

&gt;&gt;&gt; a &gt;= 3 and b &gt;= 1
True

&gt;&gt;&gt; (a + b) == 9 and b &gt; 1
True

&gt;&gt;&gt; ((a % 3) &lt; 2) and ((a + b) == 3)
False
</code></pre>
<h4 id="">赋值操作符</h4>
<p>赋值运算符用于将值赋给一个变量。</p>
<p>赋值运算符有：<code>=</code>, <code>+=</code>, <code>-=</code>, <code>*=</code>, <code>%=</code>, <code>/=</code>, <code>//=</code>, <code>**=</code></p>
<ul>
<li><code>=</code> 将值赋给一个变量。</li>
<li>其他的运算符对变量的当前值与新值进行运算，并将结果重新赋值给变量。</li>
</ul>
<p>例如：</p>
<pre><code class="language-python">&gt;&gt;&gt; x = 3
&gt;&gt;&gt; x
3

&gt;&gt;&gt; x += 15
&gt;&gt;&gt; x
18

&gt;&gt;&gt; x -= 2
&gt;&gt;&gt; x
16

&gt;&gt;&gt; x *= 2
&gt;&gt;&gt; x
32

&gt;&gt;&gt; x %= 5
&gt;&gt;&gt; x
2

&gt;&gt;&gt; x /= 1
&gt;&gt;&gt; x
2.0

&gt;&gt;&gt; x //= 2
&gt;&gt;&gt; x
1.0

&gt;&gt;&gt; x **= 5
&gt;&gt;&gt; x
1.0
</code></pre>
<p>💡 <strong>提示：</strong> 这些运算符在将结果赋值给变量之前会进行位运算：<code>&amp;=</code>，<code>|=</code>，<code>^=</code>，<code>&gt;&gt;=</code>，<code>&lt;&lt;=</code>。</p>
<h4 id="">成员操作符</h4>
<p>你可以运用操作符：<code>in</code> and <code>not in</code>来检查一个元素是否在一个序列之中。成员操作符的运算结果，要么是<code>True</code>要么是<code>False</code>。</p>
<p>例如：</p>
<pre><code class="language-python">&gt;&gt;&gt; 5 in [1, 2, 3, 4, 5]
True

&gt;&gt;&gt; 8 in [1, 2, 3, 4, 5]
False

&gt;&gt;&gt; 5 in (1, 2, 3, 4, 5)
True

&gt;&gt;&gt; 8 in (1, 2, 3, 4, 5)
False

&gt;&gt;&gt; "a" in {"a": 1, "b": 2}
True

&gt;&gt;&gt; "c" in {"a": 1, "b": 2}
False

&gt;&gt;&gt; "h" in "Hello"
False

&gt;&gt;&gt; "H" in "Hello"
True

&gt;&gt;&gt; 5 not in [1, 2, 3, 4, 5]
False

&gt;&gt;&gt; 8 not in (1, 2, 3, 4, 5)
True

&gt;&gt;&gt; "a" not in {"a": 1, "b": 2}
False

&gt;&gt;&gt; "c" not in {"a": 1, "b": 2}
True

&gt;&gt;&gt; "h" not in "Hello"
True

&gt;&gt;&gt; "H" not in "Hello"
False
</code></pre>
<p>我们通常将它们与存储序列的变量一起使用，比如这个例子：</p>
<pre><code class="language-python">&gt;&gt;&gt; message = "Hello, World!"

&gt;&gt;&gt; "e" in message
True
</code></pre>
<h2 id="python">🔹 Python中的条件语句</h2>
<p>现在我们看看如何编写一个条件语句，让它使我们程序中的某些部分根据条件的<code>True</code>或<code>False</code>来执行（或者不执行）。</p>
<h3 id="pythonif">Python 中的<code>if</code>语句</h3>
<p><code>if</code>语句的基本语法：</p>
<pre><code>if &lt;condition&gt;:
    &lt;code&gt;
</code></pre>
<p>如果条件是<code>True</code>，代码就会执行。 相反，如果是<code>False</code>，代码不会执行。</p>
<p><strong>💡 提示：</strong> 第一行结尾有一个冒号（<code>:</code>）并且代码块是有缩进的。缩进在 Python 中是必不可少的，它能让代码块属于某个条件的范畴。</p>
<p>下面是一些例子：</p>
<h4 id="false">False 的情况</h4>
<pre><code>x = 5

if x &gt; 9:
    print("Hello, World!")
</code></pre>
<p>条件判断是<code>x &gt; 9</code>，代码块是<code>print("Hello, World!")</code>。</p>
<p>上面的例子，条件判断结果是<code>False</code>，所以不会有输出。</p>
<h4 id="true">True的情况</h4>
<p>看另外一个例子，条件判断结果是<code>True</code>：</p>
<pre><code>color = "Blue"

if color == "Blue":
    print("This is my favorite color")
</code></pre>
<p>输出：</p>
<pre><code>"This is my favorite color"
</code></pre>
<h4 id="">条件语句后面的代码块</h4>
<p>下面的例子中，代码块会在条件判断后执行。注意最后一行代码没有缩进，这就表示它并不属于条件语句的代码块。</p>
<pre><code class="language-python">x = 5

if x &gt; 9:
    print("Hello!")

print("End")
</code></pre>
<p>上面的例子中，判断条件<code>x &gt; 9</code>是<code>False</code>，所以第一个 print 语句不会执行，但是最后一个 print 语句会被执行，因为它并不属于上面条件语句的代码块，所以最终的输出会是：</p>
<pre><code class="language-python">End
</code></pre>
<p>然而，如果条件是<code>True</code>，像下面的例子：</p>
<pre><code class="language-python">x = 15

if x &gt; 9:
    print("Hello!")

print("End")
</code></pre>
<p>输出：</p>
<pre><code>Hello!
End
</code></pre>
<h4 id="">条件语句的例子</h4>
<p>条件语句的另外一个例子：</p>
<pre><code class="language-python">favorite_season = "Summer"

if favorite_season == "Summer":
    print("That is my favorite season too!")
</code></pre>
<p>输出：</p>
<pre><code class="language-python">That is my favorite season too!
</code></pre>
<p>如果我们改变<code>favorite_season</code>的值：</p>
<pre><code class="language-python">favorite_season = "Winter"

if favorite_season == "Summer":
    print("That is my favorite season too!")
</code></pre>
<p>将不会有输出，因为条件是<code>False</code>。</p>
<h3 id="pythonifelse">Python 中的<code>if/else</code>语句</h3>
<p>如果我们需要指定当条件为<code>False</code>时应该做些什么，那么我们可以在条件语句中增加一个<code>else</code>字句。</p>
<p>这是一般语法：</p>
<pre><code class="language-python">if &lt;condition&gt;:
    &lt;code&gt;
else:
    &lt;code&gt;
</code></pre>
<p><strong>💡 提示：</strong> 注意上面的两个代码块都有缩进（<code>if</code>与<code>else</code>）。这些缩进对于 Python 能区分代码块是属于 if 还是 else 语句至关重要。</p>
<p>让我们看一个<code>else</code>子语的例子：</p>
<h4 id="true">True 的情况</h4>
<pre><code class="language-python">x = 15

if x &gt; 9:
    print("Hello!")
else:
    print("Bye!")

print("End")
</code></pre>
<p>输出:</p>
<pre><code>Hello!
End
</code></pre>
<p>当<code>if</code>的条件判断是<code>True</code>时，if子句被执行，<code>else</code>子句不会执行。</p>
<h4 id="false">False 的情况</h4>
<p>这次<code>else</code>子句会被执行，因为条件判断是<code>False</code>。</p>
<pre><code class="language-python">x = 5

if x &gt; 9:
    print("Hello!")
else:
    print("Bye!")

print("End")
</code></pre>
<p>输出：</p>
<pre><code>Bye!
End
</code></pre>
<h3 id="pythonifelifelse">Python 中的<code>if/elif/else</code>语句</h3>
<p>为了进一步定制我们的条件语句，我们还可以添加一个或多个<code>elif</code>子句，用来处理多个条件判断。 只有第一个条件为<code>True</code>的子句会被执行。</p>
<p><strong>💡 提示：</strong> <code>elif</code>必须写在<code>if</code>与<code>else</code>之间。</p>
<h4 id="true">第一个条件为 True 的情况</h4>
<pre><code class="language-python">x = 5

if x &lt; 9:
    print("Hello!")
elif x &lt; 15:
    print("It's great to see you")
else:
    print("Bye!")

print("End")
</code></pre>
<p>这里有两个条件判断<code>x &lt; 9</code>与<code>x &lt; 15</code>。从上到下，只有第一个条件为<code>True</code>的代码块会被执行。</p>
<p>这种情况的输出：</p>
<pre><code>Hello!
End
</code></pre>
<p>因为第一个条件为<code>True</code>：<code>x &lt; 9</code>。</p>
<h4 id="true">第二个条件为 True 的情况</h4>
<p>如果第一个条件为<code>False</code>，接着会检查第二个条件。</p>
<p>下面的例子中，第一个条件<code>x &lt; 9</code>是<code>False</code>，但是第二个条件<code>x &lt; 15</code>是<code>True</code>，所以属于第二个条件的代码块会被执行。</p>
<pre><code class="language-python">x = 13

if x &lt; 9:
    print("Hello!")
elif x &lt; 15:
    print("It's great to see you")
else:
    print("Bye!")

print("End")
</code></pre>
<p>输出：</p>
<pre><code>It's great to see you
End
</code></pre>
<h4 id="false">所有条件为 False 的情况</h4>
<p>如果所有条件为<code>False</code>，然后<code>else</code>子句会被执行：</p>
<pre><code class="language-python">x = 25

if x &lt; 9:
    print("Hello!")
elif x &lt; 15:
    print("It's great to see you")
else:
    print("Bye!")

print("End")
</code></pre>
<p>输出：</p>
<pre><code>Bye!
End
</code></pre>
<h4 id="elif">多个 elif 子句的情况</h4>
<p>我们可以根据需要添加任意多的<code>elif</code>子句。下面是一个具有两个<code>elif</code>子句的例子：</p>
<pre><code class="language-python">if favorite_season == "Winter":
    print("That is my favorite season too")
elif favorite_season == "Summer":
    print("Summer is amazing")
elif favorite_season == "Spring":
    print("I love spring")
else:
    print("Fall is my mom's favorite season")
</code></pre>
<p>每一个条件都会被检查，但只有第一个条件为<code>True</code>的代码块会被执行。如果没有为<code>True</code>的，<code>else</code>子句将会被执行。</p>
<h2 id="pythonfor">🔸 Python中的for循环</h2>
<p>我们已经了解如何写条件语句, 现在我们来看看for循环。 For循环是一种神奇的代码结构，你可以用它来将代码重复执行你所指定的次数。</p>
<p>Python中for循环基本语法:</p>
<pre><code>for &lt;loop_variable&gt; in &lt;iterable&gt;:
    &lt;code&gt;
</code></pre>
<p>iterable 表示可迭代对象，它可以是一个列表，元组，字典，字符串，range 返回的一个序列，一个文件，或者其他任意的可迭代类型的数据。下面我们就从<code>range()</code>开始。</p>
<h3 id="range"><code>range()</code>函数</h3>
<p>这个函数返回一个整数序列，我们可以用它来确定循环的迭代次数。循环对每一个整数执行一次迭代。</p>
<p><strong>💡 提示：</strong> 每个整数在每次迭代中都会被赋给一个循环变量。</p>
<p>使用<code>range()</code>来创建 for 循环的基本语法：</p>
<pre><code>for &lt;loop_variable&gt; in range(&lt;start&gt;, &lt;stop&gt;, &lt;step&gt;):
    &lt;code&gt;
</code></pre>
<p>就像你看到的，range 函数有三个参数：</p>
<ul>
<li><code>start</code>：整数序列开始的数字，默认值是<code>0</code>。</li>
<li><code>stop</code>：整数序列结束的数字(不包含)。</li>
<li><code>step</code>：序列中从当前数字到下一个数字需要增加的值，默认值是<code>1</code>。</li>
</ul>
<p>你可以传 1 个、2 个或 3 个参数给<code>range()</code>：</p>
<ul>
<li>1 个参数，它会赋值给<code>stop</code>参数，其他两个参数取默认值。</li>
<li>2 个参数，会分别赋值给<code>start</code>和<code>stop</code>参数，<code>step</code>取默认值。</li>
<li>3 个参数，会根据顺序分别赋值给<code>start</code>，<code>stop</code>与<code>step</code>。</li>
</ul>
<p><strong>1 个参数</strong>的例子：</p>
<pre><code class="language-python">for i in range(5):
    print(i)
</code></pre>
<p>输出：</p>
<pre><code>0
1
2
3
4
</code></pre>
<p>💡 <strong>提示：</strong> 循环变量会被自动更新。</p>
<pre><code class="language-python">&gt;&gt;&gt; for j in range(15):
    print(j * 2)
</code></pre>
<p>输出：</p>
<pre><code class="language-python">0
2
4
6
8
10
12
14
16
18
20
22
24
26
28
</code></pre>
<p>下面的例子中，每次迭代我们将字符串重复了跟循环变量值一样多的次数。</p>
<pre><code class="language-python">&gt;&gt;&gt; for num in range(8):
	print("Hello" * num)
</code></pre>
<p>输出：</p>
<pre><code class="language-python">Hello
HelloHello
HelloHelloHello
HelloHelloHelloHello
HelloHelloHelloHelloHello
HelloHelloHelloHelloHelloHello
HelloHelloHelloHelloHelloHelloHello
</code></pre>
<p>我们还可以将 for 循环用于内置数据结构，比如列表：</p>
<pre><code class="language-python">&gt;&gt;&gt; my_list = ["a", "b", "c", "d"]

&gt;&gt;&gt; for i in range(len(my_list)):
	print(my_list[i])
</code></pre>
<p>输出：</p>
<pre><code>a
b
c
d
</code></pre>
<p>💡 <strong>提示：</strong> 当你使用<code>range(len(&lt;seq&gt;))</code>，你会得到一个从<code>0</code>到<code>len(&lt;seq&gt;)-1</code>的整数序列。下面的例子展示了序列的有效的索引范围。</p>
<p><strong>2 个参数</strong>的例子：</p>
<pre><code class="language-python">&gt;&gt;&gt; for i in range(2, 10):
	print(i)
</code></pre>
<p>输出：</p>
<pre><code class="language-python">2
3
4
5
6
7
8
9
</code></pre>
<p><strong>代码：</strong></p>
<pre><code class="language-python">&gt;&gt;&gt; for j in range(2, 5):
	print("Python" * j)
</code></pre>
<p>输出：</p>
<pre><code class="language-python">PythonPython
PythonPythonPython
PythonPythonPythonPython
</code></pre>
<p><strong>代码：</strong></p>
<pre><code class="language-python">&gt;&gt;&gt; my_list = ["a", "b", "c", "d"]

&gt;&gt;&gt; for i in range(2, len(my_list)):
	print(my_list[i])
</code></pre>
<p>输出：</p>
<pre><code class="language-python">c
d
</code></pre>
<p><strong>代码：</strong></p>
<pre><code class="language-python">&gt;&gt;&gt; my_list = ["a", "b", "c", "d"]

&gt;&gt;&gt; for i in range(2, len(my_list)-1):
	my_list[i] *= i
</code></pre>
<p>现在的列表时：<code>['a', 'b', 'cc', 'd']</code></p>
<p><strong>3 个参数</strong>的例子：</p>
<pre><code class="language-python">&gt;&gt;&gt; for i in range(3, 16, 2):
	print(i)
</code></pre>
<p>输出：</p>
<pre><code class="language-python">3
5
7
9
11
13
15
</code></pre>
<p><strong>代码：</strong></p>
<pre><code>&gt;&gt;&gt; for j in range(10, 5, -1):
	print(j)
</code></pre>
<p>输出：</p>
<pre><code class="language-python">10
9
8
7
6
</code></pre>
<p><strong>代码：</strong></p>
<pre><code class="language-python">&gt;&gt;&gt; my_list = ["a", "b", "c", "d", "e", "f", "g"]

&gt;&gt;&gt; for i in range(len(my_list)-1, 2, -1):
	print(my_list[i])
</code></pre>
<p>输出：</p>
<pre><code class="language-python">g
f
e
d
</code></pre>
<h3 id="python">Python 中如何迭代所有可迭代对象</h3>
<p>我们可以使用 for 循环直接迭代可迭代对象，例如列表、元组、字典、字符串和文件。在每一次迭代中，我们可以获取到它们元素中的一个，这对能直接使用这些对象非常有帮助。</p>
<p>让我们看一些例子：</p>
<h4 id="">迭代一个字符串</h4>
<p>如果我们迭代一个字符串，那么它的每一个字符（包括空格和符号）都会一个一个地赋值给循环变量。</p>
<pre><code class="language-python">&gt;&gt;&gt; message = "Hello, World!"

&gt;&gt;&gt; for char in message:
	print(char)

	
H
e
l
l
o
,
 
W
o
r
l
d
!
</code></pre>
<p>我们还可以在 for 循环中迭代通过调用字符串方法修改后返回的字符串副本，就像这样：</p>
<pre><code class="language-python">&gt;&gt;&gt; word = "Hello"

&gt;&gt;&gt; for char in word.lower(): # calling the string method
	print(char)

	
h
e
l
l
o
</code></pre>
<pre><code class="language-python">&gt;&gt;&gt; word = "Hello"

&gt;&gt;&gt; for char in word.upper(): # calling the string method
	print(char)

	
H
E
L
L
O
</code></pre>
<h4 id="">迭代列表和元组</h4>
<pre><code class="language-python">&gt;&gt;&gt; my_list = [2, 3, 4, 5]

&gt;&gt;&gt; for num in my_list:
	print(num)
</code></pre>
<p>输出：</p>
<pre><code class="language-python">2
3
4
5
</code></pre>
<p><strong>代码：</strong></p>
<pre><code class="language-python">&gt;&gt;&gt; my_list = (2, 3, 4, 5)

&gt;&gt;&gt; for num in my_list:
	if num % 2 == 0:
		print("Even")
	else:
		print("Odd")
</code></pre>
<p>输出：</p>
<pre><code class="language-python">Even
Odd
Even
Odd
</code></pre>
<h3 id="">迭代字典所有的键、所有的值以及所有的键值对</h3>
<p>我们可以通过调用字典特定的方法来对其所有的键、值以及键值对进行迭代，让我们看看是怎么做到的：</p>
<p>要<strong>迭代</strong> <strong>所有键</strong>，可以这样：</p>
<pre><code class="language-python">for &lt;var&gt; in &lt;dictionary_variable&gt;:
    &lt;code&gt;
</code></pre>
<p>我们只要将可迭代对象换成字典变量的名称即可。</p>
<p><strong>💡 提示：</strong> 你还可以写成<code>&lt;dictionary_variable&gt;.keys()</code>，但直接使用字典对象的变量名称会更方便，且它们的效果是一样的。</p>
<p>例如：</p>
<pre><code class="language-python">&gt;&gt;&gt; my_dict = {"a": 1, "b": 2, "c": 3}

&gt;&gt;&gt; for key in my_dict:
	print(key)

	
a
b
c
</code></pre>
<p><strong>💡 提示：</strong> 你可以给循环变量赋一个任意有效的名称。</p>
<p>要<strong>迭代</strong> <strong>所有值</strong>，我们可以：</p>
<pre><code class="language-python">for &lt;var&gt; in &lt;dictionary_variable&gt;.values():
    &lt;code&gt;
</code></pre>
<p>例如：</p>
<pre><code class="language-python">&gt;&gt;&gt; my_dict = {"a": 1, "b": 2, "c": 3}

&gt;&gt;&gt; for value in my_dict.values():
	print(value)

	
1
2
3
</code></pre>
<p>要<strong>迭代</strong> <strong>所有键值对</strong>，我们可以：</p>
<pre><code class="language-python">for &lt;key&gt;, &lt;value&gt; in &lt;dictionary_variable&gt;.items():
    &lt;code&gt;
</code></pre>
<p>💡 <strong>提示：</strong> 我们需要定义两个循环变量，因为循环中一个对应键，一个对应值。</p>
<pre><code class="language-python">&gt;&gt;&gt; my_dict = {"a": 1, "b": 2, "c": 3}

&gt;&gt;&gt; for key, value in my_dict.items():
	print(key, value)

	
a 1
b 2
c 3
</code></pre>
<p>如果我们只定义了一个循环变量，它的值将会是一个包含键和值的元组：</p>
<pre><code class="language-python">&gt;&gt;&gt; my_dict = {"a": 1, "b": 2, "c": 3}
&gt;&gt;&gt; for pair in my_dict.items():
	print(pair)

	
('a', 1)
('b', 2)
('c', 3)
</code></pre>
<h3 id="breakcontinue">循环中断（break）和跳过（continue）</h3>
<p>现在我们已经知道如何对序列进行了，我们还有循环控制语句来自定义循环运行时发生的情况：<code>break</code>与<code>continue</code>。</p>
<h4 id="break">Break语句</h4>
<p><code>break</code>用于立即停止循环。</p>
<p>当发现一个<code>break</code>语句，循环会停止，程序会回到循环之外正常执行。</p>
<p>下面的例子中，当我找到一个元素时终止了循环。</p>
<pre><code class="language-python">&gt;&gt;&gt; my_list = [1, 2, 3, 4, 5]

&gt;&gt;&gt; for elem in my_list:
	if elem % 2 == 0:
		print("Even:", elem)
		print("break")
		break
	else:
		print("Odd:", elem)

		
Odd: 1
Even: 2
break
</code></pre>
<h4 id="continue">Continue语句</h4>
<p><code>continue</code>用于跳过当前迭代。</p>
<p>当循环执行时遇到<code>continue</code>语句，当前迭代会被停止，新的迭代会以更新后的循环变量值开始。</p>
<p>下面的例子中，当元素时偶数的时候我们跳过当前迭代，奇数的时候我们输出元素的值：</p>
<pre><code class="language-python">&gt;&gt;&gt; my_list = [1, 2, 3, 4, 5]

&gt;&gt;&gt; for elem in my_list:
	if elem % 2 == 0:
		print("continue")
		continue
	print("Odd:", elem)

	
Odd: 1
continue
Odd: 3
continue
Odd: 5
</code></pre>
<h3 id="pythonzip">Python 中的 zip() 函数</h3>
<p><code>zip()</code>是一个神奇的内置函数，我们可以使用它一次迭代多个序列，并且在每次迭代中我们可以获取到每个序列中对应的元素。</p>
<p>我们只需要将各个序列作为参数传给<code>zip()</code>函数，并且将其返还的结果作为可迭代对象放到循环中即可。</p>
<p>例如：</p>
<pre><code class="language-python">&gt;&gt;&gt; my_list1 = [1, 2, 3, 4]
&gt;&gt;&gt; my_list2 = [5, 6, 7, 8]

&gt;&gt;&gt; for elem1, elem2 in zip(my_list1, my_list2):
	print(elem1, elem2)

	
1 5
2 6
3 7
4 8
</code></pre>
<h3 id="pythonenumerate">Python 中的 enumerate() 函数</h3>
<p>你还可以在循环中使用<code>enum()</code>函数来对循环进行跟踪和计数。它通常被用于迭代一个序列，并获取元素相应的索引。</p>
<p><strong>💡 提示：</strong> 默认情况下，计数器的开始值时<code>0</code>。</p>
<p>例如：</p>
<pre><code class="language-python">&gt;&gt;&gt; my_list = [5, 6, 7, 8]

&gt;&gt;&gt; for i, elem in enumerate(my_list):
	print(i, elem)

	
0 5
1 6
2 7
3 8
</code></pre>
<pre><code class="language-python">&gt;&gt;&gt; word = "Hello"

&gt;&gt;&gt; for i, char in enumerate(word):
	print(i, char)

	
0 H
1 e
2 l
3 l
4 o
</code></pre>
<p>如果你从<code>0</code>开始计数，那么你可以在同一迭代中使用索引和当前值来修改序列。</p>
<pre><code class="language-python">&gt;&gt;&gt; my_list = [5, 6, 7, 8]

&gt;&gt;&gt; for index, num in enumerate(my_list):
	my_list[index] = num * 3

&gt;&gt;&gt; my_list
[15, 18, 21, 24]
</code></pre>
<p>给<code>enumerate()</code>函数传入第二个参数，可以让我们从不同的起始值开始计数：</p>
<pre><code class="language-python">&gt;&gt;&gt; word = "Hello"

&gt;&gt;&gt; for i, char in enumerate(word, 2):
	print(i, char)

	
2 H
3 e
4 l
5 l
6 o
</code></pre>
<h4 id="else">else 子句</h4>
<p>For 循环还有一个<code>else</code>子句。你可以在<code>else</code>子句中添加额外的代码附加到 for 循环的后面，只有当 for 循环的 break 语句没有被执行到的时候它才会被执行。</p>
<p><strong>💡 提示：</strong> 如果<code>break</code>语句被执行，<code>else</code>子句不会执行；如果<code>break</code>没有被执行，<code>else</code>子句就会被执行。</p>
<p>下面的例子中，我们尝试在列表中找到一个大于 6 的元素，但是没找到，所以<code>break</code>语句没有被执行，而<code>else</code>语句被执行了。</p>
<pre><code class="language-python">my_list = [1, 2, 3, 4, 5]

for elem in my_list:
    if elem &gt; 6:
        print("Found")
        break
else:
    print("Not Found")
</code></pre>
<p>输出：</p>
<pre><code>Not Found
</code></pre>
<p>但是，如果<code>break</code>语句执行了，<code>else</code>不会被执行。从下面的例子中我们可以看到这一点：</p>
<pre><code class="language-python">my_list = [1, 2, 3, 4, 5, 8] # Now the list has the value 8

for elem in my_list:
    if elem &gt; 6:
        print("Found")
        break
else:
    print("Not Found")
</code></pre>
<p>输出：</p>
<pre><code>Found
</code></pre>
<h2 id="pythonwhile">🔹 Python 中的 While 循环</h2>
<p>While 循环跟 for 循环一样，都是让我们可以重复执行一个代码块，不同之处是 while 与执行之前有一个条件判断要为<code>True</code>。</p>
<p>在 while 循环中，我们要定义一个条件语句，它不是数字的迭代。当条件为<code>False</code>时终止循环。</p>
<p>while 循环的通用语法：</p>
<pre><code class="language-python">while &lt;condition&gt;:
    &lt;code&gt;
</code></pre>
<p>💡 <strong>提示：</strong> 在 while 循环中，循环变量会作为条件语句的一部分，我们必须要更新这个循环变量，以确保条件语句最终会变为<code>False</code>。</p>
<p>例如：</p>
<pre><code class="language-python">&gt;&gt;&gt; x = 6

&gt;&gt;&gt; while x &lt; 15:
	print(x)
	x += 1

	
6
7
8
9
10
11
12
13
14
</code></pre>
<pre><code class="language-python">&gt;&gt;&gt; x = 4

&gt;&gt;&gt; while x &gt;= 0:
	print("Hello" * x)
	x -= 1

	
HelloHelloHelloHello
HelloHelloHello
HelloHello
Hello
</code></pre>
<pre><code class="language-python">&gt;&gt;&gt; num = 5

&gt;&gt;&gt; while num &gt;= 1:
	print("*" * num)
	num -= 2

	
*****
***
*
</code></pre>
<h4 id="breakcontinue">Break 与 Continue</h4>
<p>在 while 循环中我们同样可以使用<code>break</code>和<code>continue</code>，它们工作的原理跟 for 循环是完全一样的：</p>
<ul>
<li><code>break</code> 立即停止 while 循环</li>
<li><code>continue</code> 停止当前迭代并开始下一个迭代</li>
</ul>
<p>例如：</p>
<pre><code class="language-python">&gt;&gt;&gt; x = 5

&gt;&gt;&gt; while x &lt; 15:
	if x % 2 == 0:
		print("Even:", x)
		break
	print(x)
	x += 1
    

5
Even: 6
</code></pre>
<pre><code class="language-python">&gt;&gt;&gt; x = 5

&gt;&gt;&gt; while x &lt; 15:
	if x % 2 == 0:
		x += 1
		continue
	print("Odd:", x)
	x += 1

	
Odd: 5
Odd: 7
Odd: 9
Odd: 11
Odd: 13
</code></pre>
<h4 id="else"><code>else</code>子句</h4>
<p>我们同样可以给 while 循环添加一个<code>else</code>子句。如果<code>break</code>被执行，<code>else</code>子句不会执行，如果<code>break</code>没有被执行，<code>else</code>子句就会被执行。</p>
<p>看下面的例子：</p>
<pre><code class="language-python">x = 5

while x &lt; 15:
	if x % 2 == 0:
		print("Even number found")
		break
	print(x)
	x += 2
else:
	print("All numbers were odd")
</code></pre>
<p>输出：</p>
<pre><code class="language-python">5
7
9
11
13
All numbers were odd
</code></pre>
<p>但是下面的例子中，<code>break</code>会被执行，<code>else</code>不会被执行：</p>
<pre><code>x = 5

while x &lt; 15:
	if x % 2 == 0:
		print("Even number found")
		break
	print(x)
	x += 1 # Now we are incrementing the value by 1
else:
	print("All numbers were odd")
</code></pre>
<p>输出：</p>
<pre><code class="language-python">5
Even number found
</code></pre>
<h4 id="while">无限 While 循环</h4>
<p>当我们在处理循环的时候，可能会遇到“无限循环”。如果条件永远不为<code>False</code>，在无外部干扰的情况下，循环将永远不会停止。</p>
<p>这种情况通常发生在我们没能正确的更新条件语句中的循环变量。</p>
<p><strong>💡 提示：</strong> 你必须对这些变量进行必要的更新，以确保条件语句最终的结果为<code>False</code>。</p>
<p>例如：</p>
<pre><code class="language-python">&gt;&gt;&gt; x = 5

&gt;&gt;&gt; while x &gt; 2:
	print(x)

	
5
5
5
5
5
5
5
5
5
.
.
.
# The output continues indefinitely
</code></pre>
<p>💡 <strong>提示：</strong> 要结束这个进程，你可以按<code>CTRL + C</code>，你将会看到一个<code>KeyboardInterrupt</code>消息。</p>
<h2 id="">🔸 循环嵌套</h2>
<p>我们可以在 for 循环里面再写一个 for 循环，或者在 while 循环里面再写一个 while 循环。这种循环里面的循环就叫做嵌套的循环。</p>
<p>💡 <strong>提示：</strong> 外部循环的每一次迭代，内部循环都会执行一次。</p>
<h3 id="for">嵌套的For循环</h3>
<pre><code class="language-python">&gt;&gt;&gt; for i in range(3):
	for j in range(2):
		print(i, j)

		
0 0
0 1
1 0
1 1
2 0
2 1
</code></pre>
<p>如果我们添加 print 语句，我们将会发现这里背后发生了什么：</p>
<pre><code class="language-python">&gt;&gt;&gt; for i in range(3):
	print("===&gt; Outer Loop")
	print(f"i = {i}")
	for j in range(2):
		print("Inner Loop")
		print(f"j = {j}")

		
===&gt; Outer Loop
i = 0
Inner Loop
j = 0
Inner Loop
j = 1
===&gt; Outer Loop
i = 1
Inner Loop
j = 0
Inner Loop
j = 1
===&gt; Outer Loop
i = 2
Inner Loop
j = 0
Inner Loop
j = 1
</code></pre>
<p>外部循环每迭代一次，内部循环会迭代两次。 内部和外部循环的循环变量在各自迭代一次后都会被更新。</p>
<p>另外一个例子：</p>
<pre><code class="language-python">&gt;&gt;&gt; num_rows = 5

&gt;&gt;&gt; for i in range(5):
	for num_cols in range(num_rows-i):
		print("*", end="")
	print()

	
*****
****
***
**
*
</code></pre>
<h3 id="while">嵌套的 While 循环</h3>
<p>下面是一个 while 循环嵌套的例子。在这种情况下，我们必须更新作为条件语句的一部分的循环变量，以保证循环的终止。</p>
<pre><code class="language-python">&gt;&gt;&gt; i = 5

&gt;&gt;&gt; while i &gt; 0:
	j = 0
	while j &lt; 2:
		print(i, j)
		j += 1
	i -= 1

	
5 0
5 1
4 0
4 1
3 0
3 1
2 0
2 1
1 0
1 1
</code></pre>
<p>💡 <strong>提示：</strong> 我们同样可以将 for 循环写在 while 循环里面，或者将 while 循环写到 for 循环里面。</p>
<h2 id="python">🔹 Python 的函数</h2>
<p>在 Python 中，我们可以定义函数来使我们的代码可重用、更具可读性和组织性。下面是函数的基本语法：</p>
<pre><code class="language-python">def &lt;function_name&gt;(&lt;param1&gt;, &lt;param2&gt;, ...):
    &lt;code&gt;
</code></pre>
<p><strong>💡 提示：</strong> 函数可以有 0 个，1 个或多个参数。</p>
<h3 id="">无参数函数</h3>
<p>函数定义时，函数名后跟一对空的括号，那它就是无参数函数。例如：</p>
<pre><code class="language-python">def print_pattern():
    size = 4
    for i in range(size):
        print("*" * size)
</code></pre>
<p>调用函数时的输出：</p>
<pre><code class="language-python">&gt;&gt;&gt; print_pattern()
****
****
****
****
</code></pre>
<p><strong>💡 提示：</strong> 在调用的时候，你必须在函数名后加一对空括号。</p>
<h3 id="1">有 1 个参数的函数</h3>
<p>函数定义时，函数名后的括号中是一个或多个参数的列表。</p>
<pre><code class="language-python">def welcome_student(name):
    print(f"Hi, {name}! Welcome to class.")
</code></pre>
<p>当调用函数时，我们只需要传递一个值作为参数，该值会被函数定义中使用参数的地方替代：</p>
<pre><code class="language-python">&gt;&gt;&gt; welcome_student("Nora")
Hi, Nora! Welcome to class.
</code></pre>
<p>再看另外一个例子 – 一个打印由星号构成的图案的函数。你需要指定所要打印的行数：</p>
<pre><code class="language-python">def print_pattern(num_rows):
    for i in range(num_rows):
        for num_cols in range(num_rows-i):
            print("*", end="")
        print()
</code></pre>
<p>你可以看到不同的<code>num_rows</code>值，输出不同的结果：</p>
<pre><code>&gt;&gt;&gt; print_pattern(3)
***
**
*

&gt;&gt;&gt; print_pattern(5)
*****
****
***
**
*

&gt;&gt;&gt; print_pattern(8)
********
*******
******
*****
****
***
**
*
</code></pre>
<h3 id="2">2 个或多个参数的函数</h3>
<p>为了定义 2 个或多个参数，我们只需要将它们用逗号进行分割：</p>
<pre><code>def print_sum(a, b):
    print(a + b)
</code></pre>
<p>当调用上面的函数时，我们必须得传 2 个参数：</p>
<pre><code class="language-python">&gt;&gt;&gt; print_sum(4, 5)
9

&gt;&gt;&gt; print_sum(8, 9)
17

&gt;&gt;&gt; print_sum(0, 0)
0

&gt;&gt;&gt; print_sum(3, 5)
8
</code></pre>
<p>我们可以将刚刚看到的带有一个参数的函数调整为使用两个参数并打印带有自定义字符的图案：</p>
<pre><code class="language-python">def print_pattern(num_rows, char):
	for i in range(num_rows):
		for num_cols in range(num_rows-i):
			print(char, end="")
		print()
</code></pre>
<p>你可以看到下面带有自定义字符的输出，是通过我们传了 2 个参数的调用输出的。</p>
<pre><code>&gt;&gt;&gt; print_pattern(5, "A")
AAAAA
AAAA
AAA
AA
A

&gt;&gt;&gt; print_pattern(8, "%")
%%%%%%%%
%%%%%%%
%%%%%%
%%%%%
%%%%
%%%
%%
%

&gt;&gt;&gt; print_pattern(10, "#")
##########
#########
########
#######
######
#####
####
###
##
#
</code></pre>
<h3 id="">如何返回一个值</h3>
<p>很好。现在你已经知道了如何定义一个函数，那么让我们看看如何使用 return 语句。</p>
<p>我们经常需要从函数中返回一个值，而<code>return</code>语句可以做到。我们只需要将 return 语句加到函数的定义中。</p>
<pre><code class="language-python">return &lt;value_to_return&gt;
</code></pre>
<p><strong>💡 提示：</strong> 当发现<code>return</code>语句时，函数会立即停止执行并返回值。</p>
<p>例如：</p>
<pre><code class="language-python">def get_rectangle_area(length, width):
    return length * width
</code></pre>
<p>现在我们可以调用该函数并将结果赋给一个变量，因为结果是由该函数返回的。</p>
<pre><code class="language-python">&gt;&gt;&gt; area = get_rectangle_area(4, 5)
&gt;&gt;&gt; area
20
</code></pre>
<p>我们也可以用条件语句跟<code>return</code>语句一起使用，return 会根据条件是<code>True</code>还是<code>False</code>来返回一个值。</p>
<p>下面的例子中，函数返回序列中找到的第一个元素：</p>
<pre><code class="language-python">def get_first_even(seq):
    for elem in seq:
        if elem % 2 == 0:
            return elem
        else:
            return None
</code></pre>
<p>如果我们调用函数，你将会看到预期的结果：</p>
<pre><code class="language-python">&gt;&gt;&gt; value1 = get_first_even([2, 3, 4, 5])
&gt;&gt;&gt; value1
2
</code></pre>
<pre><code class="language-python">&gt;&gt;&gt; value2 = get_first_even([3, 5, 7, 9])
&gt;&gt;&gt; print(value2)
None
</code></pre>
<p>💡 <strong>提示：</strong> 如果函数没有<code>return</code>语句，函数将会返回默认值<code>None</code>。</p>
<p><a href="https://www.python.org/dev/peps/pep-0008/#programming-recommendations">Python 代码的风格指南</a> 建议我们一贯第使用返回语句。我们应该：</p>
<blockquote>
<p>返回语句要保持一致。函数中的 return 语句，要么所有的都返回一个表达式，要么都不要返回。如果确定让所有返回语句都返回一个表达式，那么对于那些没有返回值的函数应该明确地说明返回值为 None，且在函数的结尾要有一个显式的 return 语句（如果可以执行到 return 语句）。</p>
</blockquote>
<h3 id="">默认参数</h3>
<p>对于函数，我们可以使用参数的默认值作为参数，你只需要在参数列表中使用<code>&lt;parameter&gt;=&lt;value&gt;</code>这样的语法。</p>
<p><strong>💡 提示：</strong> <a href="https://www.python.org/dev/peps/pep-0008/#other-recommendations">Python代码的风格指南</a> 中说到“我们不应该在关键字参数赋值的 = 两边使用空格”。</p>
<p>下面的例子中，我们给参数<code>b</code>赋了一个默认值 5。当函数调用时，如果我们省略参数<code>b</code>，<code>b</code>的默认值 5 将会被使用。</p>
<pre><code>def print_product(a, b=5):
    print(a * b)
</code></pre>
<p>省略参数<code>b</code>的调用, 我们看到的输出:</p>
<pre><code class="language-python">&gt;&gt;&gt; print_product(4)
20
</code></pre>
<p>从上面的结果可以确定的是，运算中确实使用了默认值 5。</p>
<p>我们还可以给参数<code>b</code>赋一个自定义的值：</p>
<pre><code class="language-python">&gt;&gt;&gt; print_product(3, 4)
12
</code></pre>
<p>💡 <strong>提示：</strong> 带有默认值的参数，需要放在参数列表的最后面。否则，你会看到一个错误：<code>语法错误：非默认值参数放到了默认值参数后面了</code>。</p>
<p>下面是用来打印图案函数的另外的一个例子。我们将<code>"*"</code>作为默认值赋值给<code>char</code>参数。</p>
<pre><code>def print_pattern(num_rows, char="*"):
	for i in range(num_rows):
		for num_cols in range(num_rows-i):
			print(char, end="")
		print()
</code></pre>
<p>现在我们可以选择用默认值或者自己赋一个值：</p>
<pre><code class="language-python">&gt;&gt;&gt; print_pattern(5)
*****
****
***
**
*

&gt;&gt;&gt; print_pattern(6, "&amp;")
&amp;&amp;&amp;&amp;&amp;&amp;
&amp;&amp;&amp;&amp;&amp;
&amp;&amp;&amp;&amp;
&amp;&amp;&amp;
&amp;&amp;
&amp;
</code></pre>
<h2 id="python">🔸 Python 中的递归</h2>
<p>一个递归函数就是能调用自己的函数。这些递归函数都有一个用于结束递归过程的基本情况，还有通过进行另一个递归调用来继续递归过程的递归情况。</p>
<p>下面是一些例子：</p>
<pre><code class="language-python">def factorial(n):
    if n == 0 or n == 1:
        return 1
    else:
        return n * factorial(n-1)
</code></pre>
<p>递归实现的阶乘函数</p>
<pre><code class="language-python">def fibonacci(n):
    if n == 0 or n == 1:
        return n
    else:
        return fibonacci(n-1) + fibonacci(n-2)
</code></pre>
<p>斐波那契函数</p>
<pre><code class="language-python">def find_power(a, b):
    if b == 0:
        return 1
    else:
        return a * find_power(a, b-1)
</code></pre>
<p>递归求幂</p>
<h2 id="python">🔹 Python 中的异常处理</h2>
<p>程序运行过程中发生的错误或意外事件被称为<strong>异常</strong>。多亏有了后面我们将看到的这些对异常的处理，才让我们的程序在发出异常时不至于突然终止。</p>
<p>让我们看看 Python 中的异常类型，以及如何处理它们。</p>
<h3 id="python">Python 中的常见异常</h3>
<p>下面是常见异常的一个列表，以及它们发生的原因：</p>
<ul>
<li><strong>ZeroDivisionError:</strong> 当除法或模运算的第二个参数为 0 时，会抛出这个异常。</li>
</ul>
<pre><code class="language-python">&gt;&gt;&gt; 5 / 0
Traceback (most recent call last):
  File "&lt;pyshell#0&gt;", line 1, in &lt;module&gt;
    5 / 0
ZeroDivisionError: division by zero

&gt;&gt;&gt; 7 // 0
Traceback (most recent call last):
  File "&lt;pyshell#1&gt;", line 1, in &lt;module&gt;
    7 // 0
ZeroDivisionError: integer division or modulo by zero

&gt;&gt;&gt; 8 % 0
Traceback (most recent call last):
  File "&lt;pyshell#2&gt;", line 1, in &lt;module&gt;
    8 % 0
ZeroDivisionError: integer division or modulo by zero
</code></pre>
<ul>
<li><strong>IndexError:</strong> 当我们试图使用一个无效的索引来访问序列的元素时，会抛出这个异常。</li>
</ul>
<pre><code class="language-python">&gt;&gt;&gt; my_list = [3, 4, 5, 6]

&gt;&gt;&gt; my_list[15]
Traceback (most recent call last):
  File "&lt;pyshell#4&gt;", line 1, in &lt;module&gt;
    my_list[15]
IndexError: list index out of range
</code></pre>
<ul>
<li><strong>KeyError:</strong> 当我们试图访问一个不存在的键值对时，就会抛出这个异常，因为这个键不在字典中。</li>
</ul>
<pre><code class="language-python">&gt;&gt;&gt; my_dict = {"a": 1, "b": 2, "c": 3}

&gt;&gt;&gt; my_dict["d"]
Traceback (most recent call last):
  File "&lt;pyshell#6&gt;", line 1, in &lt;module&gt;
    my_dict["d"]
KeyError: 'd'
</code></pre>
<ul>
<li><strong>NameError:</strong> 当访问一个前文没有定义的变量名称时会抛出此异常。</li>
</ul>
<pre><code class="language-python">&gt;&gt;&gt; b
Traceback (most recent call last):
  File "&lt;pyshell#8&gt;", line 1, in &lt;module&gt;
    b
NameError: name 'b' is not defined
</code></pre>
<ul>
<li><strong>RecursionError:</strong> 当解释器检测到超过了最大递归深度时抛出，通常发生在递归过程始终无法达到基本情形的时候。</li>
</ul>
<p>在下面的例子中，会抛出一个<code>RecursionError</code>错误。<code>factorial</code>是一个递归函数，但在每次的递归过程中传递给它的是<code>n</code>，而不是<code>n-1</code>。除非 n 的值是<code>0</code>或<code>1</code>否则不会达到基本的情形，因为参数没有被递减，所以递归过程会一直持续下去，然后就会发生这个递归错误。</p>
<pre><code class="language-python">&gt;&gt;&gt; def factorial(n):
	if n == 0 or n == 1:
		return 1
	else:
		return n * factorial(n)

	
&gt;&gt;&gt; factorial(5)
Traceback (most recent call last):
  File "&lt;pyshell#6&gt;", line 1, in &lt;module&gt;
    factorial(5)
  File "&lt;pyshell#5&gt;", line 5, in factorial
    return n * factorial(n)
  File "&lt;pyshell#5&gt;", line 5, in factorial
    return n * factorial(n)
  File "&lt;pyshell#5&gt;", line 5, in factorial
    return n * factorial(n)
  [Previous line repeated 1021 more times]
  File "&lt;pyshell#5&gt;", line 2, in factorial
    if n == 0 or n == 1:
RecursionError: maximum recursion depth exceeded in comparison
</code></pre>
<p>💡 <strong>提示：</strong> 想了解更多关于异常的知识, 建议阅读来自 Python 官网的<a href="https://docs.python.org/3/library/exceptions.html">这篇</a>。</p>
<h3 id="pythontryexcept">Python 中的<code>try</code> / <code>except</code></h3>
<p>Python 中我们可以用 try/except 来捕获异常的发生，并适当得处理它们。这样，异常中的错误就可以被适当地终止，甚至还可以从异常中恢复。</p>
<p>这是基本语法：</p>
<pre><code class="language-python">try:
    &lt;code_that_may_raise_an_exception&gt;
except:
    &lt;code_to_handle_the_exception_if_it_occurs&gt;
</code></pre>
<p>例如，如果我们接受用户的输入来访问一个列表的元素，而这个输入可能是一个无效的索引，所以可能会导致一个异常：</p>
<pre><code class="language-python">index = int(input("Enter the index: "))

try:
    my_list = [1, 2, 3, 4]
    print(my_list[index])
except:
    print("Please enter a valid index.")
</code></pre>
<p>假设我们输入无效值，比如 15，输出会是：</p>
<pre><code class="language-python">Please enter a valid index.
</code></pre>
<p>因为<code>except</code>语句被执行了。然而，如果该值是有效的，<code>try</code>中的代码将会按预期运行。</p>
<p>下面是另外一个例子：</p>
<pre><code>a = int(input("Enter a: "))
b = int(input("Enter b: "))

try:
    division = a / b
    print(division)
except:
    print("Please enter valid values.")
</code></pre>
<p>输出：</p>
<pre><code>Enter a: 5
Enter b: 0

Please enter valid values.
</code></pre>
<h3 id="python">Python 中如何捕获一个特定类型的异常</h3>
<p>在<code>try</code>子句中，我们不想捕捉和处理所有可能发生的异常，而是想要捕捉和处理一种特定类型的异常。我们只需要在<code>except</code>关键字后面指定异常的类型：</p>
<pre><code class="language-python">try:
    &lt;code_that_may_raise_an_exception&gt;
except &lt;exception_type&gt;:
    &lt;code_to_handle_an_exception_if_it_occurs&gt;
</code></pre>
<p>例如：</p>
<pre><code class="language-python">index = int(input("Enter the index: "))

try:
    my_list = [1, 2, 3, 4]
    print(my_list[index])
except IndexError: # specify the type
    print("Please enter a valid index.")
</code></pre>
<pre><code class="language-python">a = int(input("Enter a: "))
b = int(input("Enter b: "))

try:
    division = a / b
    print(division)
except ZeroDivisionError: # specify the type
    print("Please enter valid values.")
</code></pre>
<h3 id="python">如何给 Python 中的异常对象指定一个名称</h3>
<p>我们可以在<code>except</code>子句中将异常对象赋值给一个变量，这样可以让我们访问到它的描述和属性。</p>
<p>我们只需要添加<code>as &lt;name&gt;</code>，像这样：</p>
<pre><code class="language-python">try:
    &lt;code_that_may_raise_an_exception&gt;
except &lt;exception_type&gt; as &lt;name&gt;:
    &lt;code_to_handle_an_exception_if_it_occurs&gt;
</code></pre>
<p>例如：</p>
<pre><code class="language-python">index = int(input("Enter the index: "))

try:
    my_list = [1, 2, 3, 4]
    print(my_list[index])
except IndexError as e:
    print("Exception raised:", e)
</code></pre>
<p>如果我们输入的索引值为<code>15</code>：</p>
<pre><code>Enter the index: 15
Exception raised: list index out of range
</code></pre>
<p>另一个例子：</p>
<pre><code class="language-python">a = int(input("Enter a: "))
b = int(input("Enter b: "))

try:
    division = a / b
    print(division)
except ZeroDivisionError as err:
    print("Please enter valid values.", err)
</code></pre>
<p><code>b</code>的输入为<code>0</code>时：</p>
<pre><code class="language-python">Please enter valid values. division by zero
</code></pre>
<h3 id="tryexceptelse"><code>try</code> / <code>except</code> / <code>else</code></h3>
<p>如果我们想选择在执行<code>try</code>子句期间没有发生异常时的情况，我们可以在<code>except</code>后面添加一个<code>else</code>子句。</p>
<pre><code class="language-python">try:
    &lt;code_that_may_raise_an_exception&gt;
except:
    &lt;code_to_handle_an_exception_if_it_occurs&gt;
else:
    &lt;code_that_only_runs_if_no_exception_in_try&gt;
</code></pre>
<p>例如：</p>
<pre><code class="language-python">a = int(input("Enter a: "))
b = int(input("Enter b: "))

try:
    division = a / b
    print(division)
except ZeroDivisionError as err:
    print("Please enter valid values.", err)
else:
    print("Both values were valid.")
</code></pre>
<p>如果我们给<code>a</code>和<code>b</code>分别输入为<code>5</code>和<code>0</code>：</p>
<pre><code>Please enter valid values. division by zero
</code></pre>
<p>但是，如果<code>a</code>，<code>b</code>的值都是有效的, 比如是：<code>5</code>和<code>4</code>，那么<code>else</code>会在<code>try</code>子句执行完成之后执行：</p>
<pre><code class="language-python">1.25
Both values were valid.
</code></pre>
<h3 id="tryexceptelsefinally"><code>try</code> / <code>except</code> / <code>else</code> / <code>finally</code></h3>
<p>我们可以添加<code>finally</code>子句来执行一直运行的代码，即使在<code>try</code>中出现了异常。</p>
<p>例如：</p>
<pre><code class="language-python">a = int(input("Enter a: "))
b = int(input("Enter b: "))

try:
    division = a / b
    print(division)
except ZeroDivisionError as err:
    print("Please enter valid values.", err)
else:
    print("Both values were valid.")
finally:
    print("Finally!")
</code></pre>
<p>如果输入的值都是有效的，除法的输出：</p>
<pre><code>Both values were valid.
Finally!
</code></pre>
<p>如果由于<code>b</code>是<code>0</code>而发生异常，那么：</p>
<pre><code class="language-python">Please enter valid values. division by zero
Finally!
</code></pre>
<p><code>finally</code>子句都会被执行。</p>
<p><strong>💡 提示：</strong> 这个子句可以用来关闭文件，比如, 当你处理文件时抛出了异常。</p>
<h2 id="python">🔸 Python 中的面向对象编程</h2>
<p>在面向对象编程中（OOP）, 我们可以定义类作为蓝图，用于在 Python 中创建具有属性和方法（与对象相关的功能）的对象。</p>
<p>定义类的一般语法：</p>
<pre><code>class &lt;className&gt;:

    &lt;class_attribute_name&gt; = &lt;value&gt;

    def __init__(self,&lt;param1&gt;, &lt;param2&gt;, ...):
        self.&lt;attr1&gt; = &lt;param1&gt;
        self.&lt;attr2&gt; = &lt;param2&gt;
        .
        .
        .
        # As many attributes as needed
    
   def &lt;method_name&gt;(self, &lt;param1&gt;, ...):
       &lt;code&gt;
       
   # As many methods as needed
</code></pre>
<p><strong>💡 提示：</strong> <code>self</code>是类的实例(用类创建的对象)的引用。</p>
<p>如你所见，类可以有很多不同的元素，让我们来分析一下它们的细节：</p>
<h3 id="">类的头部</h3>
<p>类定义的第一行是<code>class</code>关键字和类名：</p>
<pre><code>class Dog:
</code></pre>
<pre><code>class House:
</code></pre>
<pre><code>class Ball:
</code></pre>
<p><strong>💡 提示：</strong> 如果一个类继承了另外一个类的属性和方法，我们会在括号中看到该类的名称：</p>
<pre><code>class Poodle(Dog):
</code></pre>
<pre><code>class Truck(Vehicle):
</code></pre>
<pre><code>class Mom(FamilyMember):
</code></pre>
<p>Python 中, 类名用大驼峰（也称为 Pascal Case），名称中的每个一个单词都是以大写字母开头。例如：<code>FamilyMember</code></p>
<h3 id="__init__"><code>__init__</code>和实例属性</h3>
<p>接下来，我们将使用类在 Python 中创建对象，就像我们根据图纸建造真正的房屋一样。</p>
<p>对象中的属性来自于我们在类中定义，而这些属性通常是在<code>__init__</code>方法中被初始化，而<code>__init__</code>方法会在创建类的实例时被执行。</p>
<p>这是一般语法：</p>
<pre><code class="language-python">def __init__(self, &lt;parameter1&gt;, &lt;parameter2&gt;, ...):
        self.&lt;attribute1&gt; = &lt;parameter1&gt;  # Instance attribute
        self.&lt;attribute2&gt; = &lt;parameter2&gt;  # Instance attribute
        .
        .
        .
        # As many instance attributes as needed
</code></pre>
<p>我们可以根据需要来给类指定尽可能多的属性。</p>
<p><code>Dog</code>类的一个<code> __init__</code>方法例子：</p>
<pre><code class="language-python">class Dog:

    def __init__(self, name, age):
        self.name = name
        self.age = age
</code></pre>
<p>💡 <strong>提示：</strong> 注意名称<code>__init__</code>中的前后的双下划线。</p>
<h3 id="">如何创建类的实例</h3>
<p>要创建<code>Dog</code>类的实例，我们需要指定 name 和 age 属性。</p>
<pre><code class="language-python">my_dog = Dog("Nora", 10)
</code></pre>
<p>很好。现在我们已经准备好了一个可以在代码中使用的 Dog 实例了。</p>
<p>有些类，可以不需要任何参数来创建实例。 这种情况我们只需要一个空括号，例如：</p>
<pre><code>class Circle:

    def __init__(self):
        self.radius = 1
</code></pre>
<p>创建实例：</p>
<pre><code class="language-python">&gt;&gt;&gt; my_circle = Circle()
</code></pre>
<p>💡 <strong>提示：</strong> <code>self</code>像是一个“幕后”的参数，即使我们在方法的定义中看到它，但你传参数时可以不用考虑它。</p>
<h3 id="">默认参数</h3>
<p>我们可以为类的属性指定默认值，但如果使用者想自己赋值，也是可以的。</p>
<p>这种情况下，我们可以在参数列表中写上形如：<code>&lt;attribute&gt;=&lt;value&gt;</code></p>
<p>例如：</p>
<pre><code>class Circle:

    def __init__(self, radius=1):
        self.radius = radius
</code></pre>
<p>现在我们创建<code>Circle</code>实例，你可以通过忽略 radius 参数使用它的默认值，也可以传入一个自己的值：</p>
<pre><code class="language-python"># Default value
&gt;&gt;&gt; my_circle1 = Circle()

# Customized value
&gt;&gt;&gt; my_circle2 = Circle(5)
</code></pre>
<h3 id="">如何获取实例的属性</h3>
<p>访问实例属性，可以用下面的语法：</p>
<pre><code class="language-python">&lt;object_variable&gt;.&lt;attribute&gt;
</code></pre>
<p>例如：</p>
<pre><code class="language-python"># Class definition
&gt;&gt;&gt; class Dog:

    def __init__(self, name, age):
        self.name = name
        self.age = age

# Create instance        
&gt;&gt;&gt; my_dog = Dog("Nora", 10)

# Get attributes
&gt;&gt;&gt; my_dog.name
'Nora'

&gt;&gt;&gt; my_dog.age
10
</code></pre>
<h3 id="">如何更新实例的属性</h3>
<p>更新实例的属性，我们可以用下面的语法：</p>
<pre><code>&lt;object_variable&gt;.&lt;attribute&gt; = &lt;new_value&gt;
</code></pre>
<p>例如：</p>
<pre><code class="language-python">&gt;&gt;&gt; class Dog:

    def __init__(self, name, age):
        self.name = name
        self.age = age

        
&gt;&gt;&gt; my_dog = Dog("Nora", 10)

&gt;&gt;&gt; my_dog.name
'Nora'

# Update the attribute
&gt;&gt;&gt; my_dog.name = "Norita"

&gt;&gt;&gt; my_dog.name
'Norita'
</code></pre>
<h3 id="">如何删除实例属性</h3>
<p>要删除实例属性，可以用下面的语法：</p>
<pre><code>del &lt;object_variable&gt;.&lt;attribute&gt;
</code></pre>
<p>例如：</p>
<pre><code class="language-python">&gt;&gt;&gt; class Dog:

    def __init__(self, name, age):
        self.name = name
        self.age = age

        
&gt;&gt;&gt; my_dog = Dog("Nora", 10)

&gt;&gt;&gt; my_dog.name
'Nora'

# Delete this attribute
&gt;&gt;&gt; del my_dog.name

&gt;&gt;&gt; my_dog.name
Traceback (most recent call last):
  File "&lt;pyshell#77&gt;", line 1, in &lt;module&gt;
    my_dog.name
AttributeError: 'Dog' object has no attribute 'name'
</code></pre>
<h3 id="">如何删除一个示例</h3>
<p>同样的，删除实例我们也可以用<code>del</code>：</p>
<pre><code>&gt;&gt;&gt; class Dog:

    def __init__(self, name, age):
        self.name = name
        self.age = age

        
&gt;&gt;&gt; my_dog = Dog("Nora", 10)

&gt;&gt;&gt; my_dog.name
'Nora'

# Delete the instance
&gt;&gt;&gt; del my_dog

&gt;&gt;&gt; my_dog
Traceback (most recent call last):
  File "&lt;pyshell#79&gt;", line 1, in &lt;module&gt;
    my_dog
NameError: name 'my_dog' is not defined
</code></pre>
<h3 id="vs">公开 vs. 非公开 的属性</h3>
<p>在 Python 中，我们没有用访问修饰符来限制对实例属性的访问，而是依靠命名惯例来做到这一点。</p>
<p>例如，在属性前添加一个前导下划线，就可以告诉开发者这是一个非公开的属性。</p>
<p>例如：</p>
<pre><code class="language-python">class Dog:

    def __init__(self, name, age):
        self.name = name  # Public attribute
        self._age = age   # Non-Public attribute
</code></pre>
<p>Python 文档中提到：</p>
<blockquote>
<p>一个前导下划线仅用于非公开的方法和实例变量。</p>
<p>你需要决定实例的哪些方法和变量（“属性”）是需要公开或不公开的。如果有疑惑，可以选择不公开；将一个不公开的属性改为公开，要比将其从公开改为不公开要容易得多。</p>
<p>非公开属性是那些不打算被第三方使用的属性，我们无法保证非公开属性不会被第三方使用者改变甚至被删除。- <a href="https://www.python.org/dev/peps/pep-0008/#designing-for-inheritance">源</a></p>
</blockquote>
<p>然而，如文档中还提到的：</p>
<blockquote>
<p>我们在这里不使用“私有”一词，因为在 Python 中没有任何属性是真正的私有的（省去一些不必要的工作）。- <a href="https://www.python.org/dev/peps/pep-0008/#designing-for-inheritance">源</a></p>
</blockquote>
<p><strong>💡 提示：</strong> 从技术上讲，如果我们在属性的名称中加入前导下划线，我们仍然可以访问和修改该属性，但我们不应该这样做。</p>
<h3 id="python">Python 中类的属性</h3>
<p>类的属性由类的所有实例共享。所有实例都可以访问这些属性，如果这些属性被修改，这些实例将都会受到影响。</p>
<pre><code class="language-python">class Dog:

    # Class attributes
    kingdom = "Animalia"
    species = "Canis lupus"

    def __init__(self, name, age):
        self.name = name
        self.age = age
</code></pre>
<p><strong>💡 提示：</strong> 通常，它们写在<code>__init__</code>方法的前面。</p>
<h3 id="">如何获取一个类属性</h3>
<p>要获取类属性，我们使用下面的方法：</p>
<pre><code>&lt;class_name&gt;.&lt;attribute&gt;
</code></pre>
<p>例如：</p>
<pre><code>&gt;&gt;&gt; class Dog:

    kingdom = "Animalia"

    def __init__(self, name, age):
        self.name = name
        self.age = age

        
&gt;&gt;&gt; Dog.kingdom
'Animalia'
</code></pre>
<p><strong>💡 提示：</strong> 你可以使用同样的语法在类里面获取它的值。</p>
<h3 id="">如何更新一个类属性</h3>
<p>要更新一个类属性，我们使用下面的语法：</p>
<pre><code>&lt;class_name&gt;.&lt;attribute&gt; = &lt;value&gt;
</code></pre>
<p>例如：</p>
<pre><code class="language-python">&gt;&gt;&gt; class Dog:

    kingdom = "Animalia"

    def __init__(self, name, age):
        self.name = name
        self.age = age

        
&gt;&gt;&gt; Dog.kingdom
'Animalia'

&gt;&gt;&gt; Dog.kingdom = "New Kingdom"

&gt;&gt;&gt; Dog.kingdom
'New Kingdom'
</code></pre>
<h3 id="">如何删除一个类属性</h3>
<p>我们使用<code>del</code>一个类属性。例如：</p>
<pre><code class="language-python">&gt;&gt;&gt; class Dog:

    kingdom = "Animalia"

    def __init__(self, name, age):
        self.name = name
        self.age = age

&gt;&gt;&gt; Dog.kingdom
'Animalia'
        
# Delete class attribute
&gt;&gt;&gt; del Dog.kingdom

&gt;&gt;&gt; Dog.kingdom
Traceback (most recent call last):
  File "&lt;pyshell#88&gt;", line 1, in &lt;module&gt;
    Dog.kingdom
AttributeError: type object 'Dog' has no attribute 'kingdom'
</code></pre>
<h3 id="">如何定义方法</h3>
<p>方法用于表示类实例的功能。</p>
<p><strong>💡 提示：</strong> 如果我们在实例方法的定义中写上<code>self.&lt;attribute&gt;</code>，那么实例方法就可以调用实例属性。</p>
<p>下面是定义方法的基本语法，这些方法一般定义在<code>__init__</code>方法后面：</p>
<pre><code class="language-python">class &lt;ClassName&gt;:

    # Class attributes

    # __init__

    def &lt;method_name&gt;(self, &lt;param1&gt;, ...):
        &lt;code&gt;
</code></pre>
<p>这些实例方法可能有 0 个、1 个或多个参数（就像函数！），但<code>self</code>必须是第一个参数。</p>
<p>例如，下面的<code>bark</code>方法没有参数（除了<code>self</code>）：</p>
<pre><code class="language-python">class Dog:

    def __init__(self, name, age):
        self.name = name
        self.age = age

    def bark(self):
        print(f"woof-woof. I'm {self.name}")
</code></pre>
<p>要调用这个方法，我们用下面的语法：</p>
<pre><code>&lt;object_variable&gt;.&lt;method&gt;(&lt;arguments&gt;)
</code></pre>
<p>例如：</p>
<pre><code class="language-python"># Create the instance
&gt;&gt;&gt; my_dog = Dog("Nora", 10)

# Call the method
&gt;&gt;&gt; my_dog.bark()
woof-woof. I'm Nora
</code></pre>
<p><code>Player</code>类里定义了只有一个参数的<code>increment_speed</code>方法：</p>
<pre><code class="language-python">class Player:

    def __init__(self, name):
        self.name = name
        self.speed = 50

    def increment_speed(self, value):
        self.speed += value
</code></pre>
<p>调用此方法：</p>
<pre><code># Create instance        
&gt;&gt;&gt; my_player = Player("Nora")

# Check initial speed to see the change
&gt;&gt;&gt; my_player.speed
50

# Increment the speed
&gt;&gt;&gt; my_player.increment_speed(5)

# Confirm the change
&gt;&gt;&gt; my_player.speed
55
</code></pre>
<p>💡 <strong>提示：</strong> 要添加更多参数，只需要将多个参数用逗号分隔。建议在每个逗号后面加一个空格。</p>
<h3 id="getterssetters">属性，getters 与 setters</h3>
<p>定义 getters 与 setters 方法可以用于获取和设置实例的属性值。getters 与 setters 方法充当一种中介，以“保护”属性免受直接更改。</p>
<p>在 Python 中，我们通常使用属性而不是 getter 和 setter。让我们看看如何使用它们。</p>
<p>要定义一个属性，我们可以用下面的语法编写一个方法：</p>
<pre><code>@property
def &lt;property_name&gt;(self):
    return self.&lt;attribute&gt;
</code></pre>
<p>这个方法会充当一个getter，它在我们访问属性时被调用。</p>
<p>我们可能还想定义一个setter：</p>
<pre><code>@&lt;property_name&gt;.setter
def &lt;property_name&gt;(self, &lt;param&gt;):
    self.&lt;attribute&gt; = &lt;param&gt;
</code></pre>
<p>还有一个删除器来删除属性：</p>
<pre><code>@&lt;property_name&gt;.deleter
def &lt;property_name&gt;(self):
    del self.&lt;attribute&gt;
</code></pre>
<p><strong>💡 提示：</strong> 你可以在这些方法中编写你需要的任何代码来读取、设置和删除属性。建议让这些方法尽可能简单。</p>
<p>下面是一个例子：</p>
<pre><code class="language-python">class Dog:

    def __init__(self, name):
        self._name = name

    @property
    def name(self):
        return self._name

    @name.setter
    def name(self, new_name):
        self._name = new_name

    @name.deleter
    def name(self):
        del self._name
</code></pre>
<p>如果我们添加描述性的 print 语句，我们可以看到当执行其操作时，print 语句会被调用。</p>
<pre><code class="language-python">&gt;&gt;&gt; class Dog:

    def __init__(self, name):
        self._name = name

    @property
    def name(self):
        print("Calling getter")
        return self._name

    @name.setter
    def name(self, new_name):
        print("Calling setter")
        self._name = new_name

    @name.deleter
    def name(self):
        print("Calling deleter")
        del self._name

        
&gt;&gt;&gt; my_dog = Dog("Nora")

&gt;&gt;&gt; my_dog.name
Calling getter
'Nora'

&gt;&gt;&gt; my_dog.name = "Norita"
Calling setter

&gt;&gt;&gt; my_dog.name
Calling getter
'Norita'

&gt;&gt;&gt; del my_dog.name
Calling deleter
</code></pre>
<h2 id="python">🔹 Python 中如何处理文件</h2>
<p>处理文件对于创建强大的程序非常重要。下面让我们看看如何在 Python 中执行此操作。</p>
<h3 id="python">Python 中如何读取文件</h3>
<p>在 Python 中，建议使用<code>with</code>语句来处理文件，因为它只在我们需要的时候打开文件，并且在处理完后会自动关闭文件。</p>
<p>要读取文件，我们使用下面的语法：</p>
<pre><code class="language-python">with open("&lt;file_path&gt;") as &lt;file_var&gt;:
    &lt;code&gt;
</code></pre>
<p>我们还可以在打开文件的时候，指定<code>"r"</code>以只读模式打开：</p>
<pre><code class="language-python">with open("&lt;file_path&gt;", "r") as &lt;file_var&gt;:
    &lt;code&gt;
</code></pre>
<p>不过这已经是打开文件的默认模式了，所以我们可以忽略它，例如下面的例子：</p>
<p>例子：</p>
<pre><code class="language-python">with open("famous_quotes.txt") as file:
    for line in file:
        print(line)
</code></pre>
<p>或者……</p>
<pre><code class="language-python">with open("famous_quotes.txt", "r") as file:
    for line in file:
        print(line)
</code></pre>
<p><strong>💡 提示：</strong> 是的！我们可以通过 for 循环来遍历文件所有的行。文件路径可以是一个相对于当前正在运行的 Python 脚本的相对路径，也可以是绝对路径。</p>
<h3 id="python">Python 中如何写文件</h3>
<p>写文件有两种方法。你可以将要添加的内容退换掉现有的内容，或者追加到现有内容中。</p>
<pre><code class="language-python">with open("&lt;file_path&gt;", "w") as &lt;file_var&gt;:
    &lt;code&gt;
</code></pre>
<p>要完全替换现有内容，我们可以用<code>"w"</code>模式，可以将“w”作为<code>open()</code>第二个参数来调用。我们在文件对象上调用<code>.write()</code>方法，将我们想写的内容作为参数传给该对象。</p>
<p>例如：</p>
<pre><code class="language-python">words = ["Amazing", "Green", "Python", "Code"]

with open("famous_quotes.txt", "w") as file:
    for word in words:
        file.write(word + "\n")
</code></pre>
<p>当你运行程序时，如果指定路径中的文件不存在，它会被创建。</p>
<p>这是文件内容：</p>
<pre><code class="language-python">Amazing
Green
Python
Code
</code></pre>
<h3 id="">如何向文件中追加内容</h3>
<p>然而，如果你想向文件中追加内容，那么需要使用<code>"a"</code>模式：</p>
<pre><code>with open("&lt;file_path&gt;", "a") as &lt;file_var&gt;:
    &lt;code&gt;
</code></pre>
<p>例如：</p>
<pre><code class="language-python">words = ["Amazing", "Green", "Python", "Code"]

with open("famous_quotes.txt", "a") as file:
    for word in words:
        file.write(word + "\n")
</code></pre>
<p>这个小改动将会保留文件的现有内容，它将新的内容加到最后。</p>
<p>如果我们再次运行程序，这些字符串将会被添加到文件的末尾：</p>
<pre><code class="language-python">Amazing
Green
Python
Code
Amazing
Green
Python
Code
</code></pre>
<h3 id="">如何删除文件</h3>
<p>要在我们的脚本中删除文件，得用<code>os</code>模块。建议在调用os模块的<code>remove()</code>方法之前，先检查文件是否存在。</p>
<pre><code class="language-import">import os

if os.path.exists("&lt;file_path&gt;"):
  os.remove("&lt;file_path&gt;")
else:
  &lt;code&gt;
</code></pre>
<p>例如：</p>
<pre><code class="language-python">import os

if os.path.exists("famous_quotes.txt"):
  os.remove("famous_quotes.txt")
else:
  print("This file doesn't exist")
</code></pre>
<p>你可能注意到了第一行代码<code>import os</code>，这是一个导入语句。下面我们看看它们有什么用，以及如何使用。</p>
<h2 id="python">🔸 Python 中的导入语句</h2>
<p>一个较好的做法是，随着程序规模和复杂性的增加，我们要将代码组织成多个文件。但我们需要找到一种方法来组合这些文件以使程序正常工作，而这正是导入语句的作用。</p>
<p>通过导入语句，我们可以将一个模块（包含 Python 定义和语句的文件）导入导另一个文件中。</p>
<p>下面是各种形式的导入语句：</p>
<h3 id="">第一种选择：</h3>
<pre><code>import &lt;module_name&gt;
</code></pre>
<p>例如：</p>
<pre><code>import math
</code></pre>
<p>💡 <strong>提示：</strong> <code>math</code>是Python的一个内置模块。</p>
<p>如果我们使用这个导入语句，我们需要在代码中引用的函数或元素的名称前添加模块的名称。</p>
<pre><code class="language-python">&gt;&gt;&gt; import math
&gt;&gt;&gt; math.sqrt(25)
5.0
</code></pre>
<p>我们在代码中明确的指明该元素所属的模块。</p>
<h3 id="">第二中选择：</h3>
<pre><code>import &lt;module&gt; as &lt;new_name&gt;
</code></pre>
<p>例如：</p>
<pre><code>import math as m
</code></pre>
<p>在代码中，我们可以使用我们指定的新名称，而不是模块的原始名称：</p>
<pre><code class="language-python">&gt;&gt;&gt; import math as m
&gt;&gt;&gt; m.sqrt(25)
5.0
</code></pre>
<h3 id="">第三种选择：</h3>
<pre><code>from &lt;module_name&gt; import &lt;element&gt;
</code></pre>
<p>例如：</p>
<pre><code>from math import sqrt
</code></pre>
<p>使用这个导入语句，我们可以直接调用函数，而不必指定模块的名称。</p>
<pre><code>&gt;&gt;&gt; from math import sqrt
&gt;&gt;&gt; sqrt(25)
5.0
</code></pre>
<h3 id="">第四种选择：</h3>
<pre><code>from &lt;module_name&gt; import &lt;element&gt; as &lt;new_name&gt;
</code></pre>
<p>例如：</p>
<pre><code class="language-python">from math import sqrt as square_root
</code></pre>
<p>使用这种导入语句，我们可以给从模块中导出的元素指定一个新的名字。</p>
<pre><code class="language-python">&gt;&gt;&gt; from math import sqrt as square_root
&gt;&gt;&gt; square_root(25)out
5.0
</code></pre>
<h3 id="">第五种选择：</h3>
<pre><code>from &lt;module_name&gt; import *
</code></pre>
<p>上面的导入语句导入了模块的所有元素，我们可以通过名称来直接引用这些元素，而不用指定模块名称。</p>
<p>例如：</p>
<pre><code class="language-python">&gt;&gt;&gt; from math import *

&gt;&gt;&gt; sqrt(25)
5.0

&gt;&gt;&gt; factorial(5)
120

&gt;&gt;&gt; floor(4.6)
4

&gt;&gt;&gt; gcd(5, 8)
1
</code></pre>
<p>💡 <strong>提示：</strong> 这种类型的导入语句会使我们很难知道哪些元素属于哪个模块，特别是当我们从多个模块导入元素的时候。</p>
<p>根据 <a href="https://www.python.org/dev/peps/pep-0008/#imports">Python 代码的风格指南</a>:</p>
<blockquote>
<p><strong>有通配符的导入</strong>（from <module> import *）应该避免使用，因为它们会让你搞不清楚哪些元素是属于哪个模块, 对读者和一些自动化工具都具有迷惑性。</module></p>
</blockquote>
<h2 id="python">🔹 Python 中的列表与字典推导</h2>
<p>在 Python 中，你应该知道的一个很棒的功能特性是列表与字典推导功能。它们是一种更加紧凑地创建列表和字典的方法。</p>
<h3 id="">列表推导</h3>
<p>要定义列表推导，我们可以使用下面四种语法模式中的任意一种：</p>
<pre><code>[&lt;value_to_include&gt; for &lt;var&gt; in &lt;sequence&gt;]
</code></pre>
<pre><code>[&lt;value_to_include&gt; for &lt;var1&gt; in &lt;sequence1&gt; for &lt;var2&gt; in &lt;sequence2&gt;]
</code></pre>
<pre><code>[&lt;value_to_include&gt; for &lt;var&gt; in &lt;sequence&gt; if &lt;condition&gt;]
</code></pre>
<pre><code>[&lt;value&gt; for &lt;var1&gt; in &lt;sequence1&gt; for &lt;var2&gt; in &lt;sequence2&gt; if &lt;condition&gt;]
</code></pre>
<p><strong>💡 提示：</strong> 列表推导一般使用在一些简单逻辑的情形，就是说使用它们时，我们不应该让我们的代码变得难以阅读和理解。</p>
<p>下面是一些例子：</p>
<pre><code class="language-python">&gt;&gt;&gt; [i for i in range(4, 15)]
[4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]

&gt;&gt;&gt; [chr(i) for i in range(67, 80)]
['C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O']

&gt;&gt;&gt; [i**3 for i in range(2, 5)]
[8, 27, 64]

&gt;&gt;&gt; [i + j for i in range(5, 8) for j in range(3, 6)]
[8, 9, 10, 9, 10, 11, 10, 11, 12]

&gt;&gt;&gt; [k for k in range(3, 35) if k % 2 == 0]
[4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34]

&gt;&gt;&gt; [i * j for i in range(2, 6) for j in range(3, 7) if i % j == 0]
[9, 16, 25]
</code></pre>
<h3 id="vs">列表推导 .vs. 生成器表达式</h3>
<p>列表推导使用的是中括号<code>[]</code>。而生成器表达式用的是括号<code>()</code>。它们看上去相似，但却有很大的不同。让我们看看为啥。</p>
<ul>
<li><strong>列表推导</strong> 一次产生整个序列且整个序列都存储在内存中。</li>
<li><strong>生成器表达式</strong> 当元素被要求时，一次产生一个元素。</li>
</ul>
<p>我们可以通过<code>sys</code>模块来检查上述不同。在下面的例子中，你可以看到它们的大小在内存中差别很大。</p>
<pre><code>&gt;&gt;&gt; import sys
&gt;&gt;&gt; sys.getsizeof([i for i in range(500)])
2132
&gt;&gt;&gt; sys.getsizeof((i for i in range(500)))
56
</code></pre>
<p>我们可以使用生成器表达式在 for 循环中迭代并一次获取一个元素。但如果你需要将元素存储到列表中，你应该使用列表推导。</p>
<h3 id="">字典推导</h3>
<p>现在让我们深入字典推导。定义字典推导的基本语法：</p>
<pre><code>{&lt;key_value&gt;: &lt;value&gt; for &lt;var&gt; in &lt;sequence&gt;}
</code></pre>
<pre><code class="language-python">{&lt;key_value&gt;: &lt;value&gt; for &lt;var&gt; in &lt;sequence&gt; if &lt;condition&gt;}
</code></pre>
<p>字典推导的一些例子：</p>
<pre><code>&gt;&gt;&gt; {num: num**3 for num in range(3, 15)}
{3: 27, 4: 64, 5: 125, 6: 216, 7: 343, 8: 512, 9: 729, 10: 1000, 11: 1331, 12: 1728, 13: 2197, 14: 2744}

&gt;&gt;&gt; {x: x + y for x in range(4, 8) for y in range(3, 7)}
{4: 10, 5: 11, 6: 12, 7: 13}
</code></pre>
<p>这是一个带有条件的例子，我们从一个现有的字典中提取，并创建一个新的字典，其中只有获得成绩大于或等于 60 分的学生：</p>
<pre><code>&gt;&gt;&gt; grades = {"Nora": 78, "Gino": 100, "Talina": 56, "Elizabeth": 45, "Lulu": 67}

&gt;&gt;&gt; approved_students = {student: grade for (student, grade) in grades.items() if grade &gt;= 60}

&gt;&gt;&gt; approved_students
{'Nora': 78, 'Gino': 100, 'Lulu': 67}
</code></pre>
<p>希望你喜欢这篇文章，并且它能对你有帮助。现在你已经知道了如何编写和使用 Python 中最重要的元素了。</p>
<p>⭐ <a href="https://www.youtube.com/channel/UCng0h8WiHLmT57JJ8At4LfQ">订阅我的 YouTube</a> 和关注我的 <a href="https://twitter.com/EstefaniaCassN">Twitter</a>以便找到更多的编程教程和技巧。查看我的在线教程 <a href="https://www.udemy.com/course/python-exercises-for-beginners-solve-coding-challenges/?referralCode=804D1EFAF779D07914D2">Python Exercises for Beginners: Solve 100+ Coding Challenges</a></p>
<!--kg-card-end: markdown--><p>原文：<a href="https://www.freecodecamp.org/news/python-code-examples-sample-script-coding-tutorial-for-beginners/">Python Code Examples – Sample Script Coding Tutorial for Beginners</a>，作者：<a href="https://www.freecodecamp.org/news/author/estefaniacn/">Estefania Cassingena Navone</a></p> ]]>
                </content:encoded>
            </item>
        
    </channel>
</rss>
