文章目录
- 一.基础语法
- 1.编码
- 2.标识符
- 3.保留字
- 4.注释
- 5.行与缩进
- 6.多行语句
- 7.数字(Number)类型
- 8.字符串(String)
- 9.空行
- 10.等待用户输入
- 11.同一行显示多条语句
- 12.多个语句构成代码组
- 13.print 输出
- 14.import 与 from...import
- 二.基本数据类型
- 1.变量和赋值
- 2.多个变量赋值
- 3.标准数据类型
- 4.Number(数字)
- 5.数值运算
- 6.String(字符串)
- 7.bool(布尔类型)
- 8.List(列表)
- 9.Tuple(元组)
- 10.Set(集合)
- 11.Dictionary(字典)
- 12.Python数据类型转换
- 三.运算符
- 四.条件判断
- 1.if 语句
- 2.if 嵌套
- 3.match...case
- 五.循环
- 1.while 循环
- 2.无限循环
- 3.while 循环使用 else 语句
- 4.简单语句组
- 5.for循环
- 6.for...else
- 7.range() 函数
- 8.break 和 continue 语句及循环中的 else 子句
- 9.pass 语句
一.基础语法
1.编码
默认情况下,Python 3 源码文件以 UTF-8
编码,所有字符串都是unicode
字符串。 当然你也可以为源码文件指定不同的编码:
# -*- coding: cp-1252 -*-
2.标识符
- 首字母必须是字母表中
字母或下划线 _
。 - 标识符的其他的部分由
字母、数字和下划线
组成。 - 标识符对大小写敏感。
在 Python 3 中,可以用中文作为变量名,非 ASCII 标识符也是允许的了。
3.保留字
即关键字,我们不能把它们用作任何标识符名称。Python 的标准库提供了一个 keyword 模块,可以输出当前版本的所有关键字:
import keyword
keyword.kwlist
['False', 'None', 'True', 'and', 'as', 'assert', 'break', 'class',
'continue', 'def', 'del', 'elif', 'else', 'except', 'finally', 'for', 'from',
'global', 'if', 'import', 'in', 'is', 'lambda', 'nonlocal', 'not', 'or',
'pass', 'raise', 'return', 'try', 'while', 'with', 'yield']
4.注释
Python 中单行注释以 # 开头
# 这是一个注释
print("Hello, World!")
多行注释用三个单引号 '''
或者三个双引号 """
将注释括起来,例如:
#!/usr/bin/python3
# 第一个注释
# 第二个注释
'''
第三注释
第四注释
'''
"""
第五注释
第六注释
"""
print ("Hello, Python!")
5.行与缩进
python最具特色的就是使用缩进
来表示代码块,不需要使用大括号 {}
。
- 缩进的空格数是
可变
的,但是同一个代码块的语句必须包含相同的缩进空格数
。实例如下:
if True:
print ("True")
else:
print ("False")
以下代码最后一行语句缩进数的空格数不一致,会导致运行错误:
if True:
print ("Answer")
print ("True")
else:
print ("Answer")
print ("False") # 缩进不一致,会导致运行错误
File "test.py", line 6
print ("False") # 缩进不一致,会导致运行错误
^
IndentationError: unindent does not match any outer indentation level
6.多行语句
Python 通常是一行写完一条语句,但如果语句很长,我们可以使用反斜杠 \ 来实现多行语句
,例如:
total = item_one + \
item_two + \
item_three
7.数字(Number)类型
- int (整数), 如 1, 只有一种整数类型 int,表示为长整型,没有 python2 中的 Long。
- bool (布尔), 如 True。
- float (浮点数), 如 1.23、3E-2
- complex (复数), 如 1 + 2j、 1.1 + 2.2j
8.字符串(String)
- Python 中
单引号 ' 和双引号 "
使用完全相同。 - 使用
三引号(''' 或 """)
可以指定一个多行字符串。 - 转义符 \。反斜杠可以用来转义,使用 r 可以让反斜杠不发生转义。 如 r"this is a line with \n" 则 \n 会显示,并不是换行。
- 按字面意义级联字符串,如
"this " "is " "string"
会被自动转换为 this is string。 - 字符串可以用
+ 运算符
连接在一起,用 * 运算符重复。 - Python 中的字符串有两种索引方式,
从左往右以 0 开始,从右往左以 -1 开始
。 - Python 中的字符串不能改变。
- Python 没有单独的字符类型,一个字符就是长度为 1 的字符串。
- 字符串的截取的语法格式如下
:变量[头下标:尾下标:步长]
word = '字符串'
sentence = "这是一个句子。"
paragraph = """这是一个段落,
可以由多行组成"""
#!/usr/bin/python3
str='123456789'
print(str) # 输出字符串
print(str[0:-1]) # 输出第一个到倒数第二个的所有字符
print(str[0]) # 输出字符串第一个字符
print(str[2:5]) # 输出从第三个开始到第六个的字符(不包含)
print(str[2:]) # 输出从第三个开始后的所有字符
print(str[1:5:2]) # 输出从第二个开始到第五个且每隔一个的字符(步长为2)
print(str * 2) # 输出字符串两次
print(str + '你好') # 连接字符串
print('------------------------------')
print('hello\nrunoob') # 使用反斜杠(\)+n转义特殊字符
print(r'hello\nrunoob') # 在字符串前面添加一个 r,表示原始字符串,不会发生转义
以上实例输出结果:
123456789
12345678
1
345
3456789
24
123456789123456789
123456789你好
------------------------------
hello
runoob
hello\nrunoob
9.空行
函数之间或类的方法之间用空行分隔
,表示一段新的代码的开始
。
- 类和函数入口之间也用一行空行分隔,以突出 函数入口的开始 。
- 是空行的作用在于
分隔两段不同功能或含义的代码
,便于日后代码的维护或重构。
记住:空行也是程序代码的一部分
。
10.等待用户输入
执行下面的程序在按回车键后就会等待用户输入:
#!/usr/bin/python3
input("\n\n按下 enter 键后退出。")
11.同一行显示多条语句
Python 可以在同一行中使用多条语句,语句之间使用分号 ;
分割
#!/usr/bin/python3
import sys; x = 'runoob'; sys.stdout.write(x + '\n')
12.多个语句构成代码组
缩进相同的一组语句构成一个代码块
,我们称之代码组。
- 像if、while、def和class这样的复合语句,首
行以关键字开始,以冒号( : )结束
,该行之后的一行或多行代码构成代码组。
我们将首行及后面的代码组称为一个子句(clause)。
if expression :
suite
elif expression :
suite
else :
suite
13.print 输出
print 默认输出是换行的,如果要实现不换行需要在变量末尾加上 end=""
:
x="a"
y="b"
# 换行输出
print( x )
print( y )
print('---------')
# 不换行输出
print( x, end=" " )
print( y, end=" " )
print()
以上实例执行结果为:
a
b
---------
a b
14.import 与 from…import
在 python 用import
或者from...import
来导入相应的模块。
-
将整个模块(somemodule)导入,格式为:
import somemodule
-
从某个模块中导入某个函数,格式为:
from somemodule import somefunction
-
从某个模块中导入多个函数,格式为:
from somemodule import firstfunc, secondfunc, thirdfunc
-
将某个模块中的全部函数导入,格式为:
from somemodule import *
导入 sys 模块
import sys
print('================Python import mode==========================')
print ('命令行参数为:')
for i in sys.argv:
print (i)
print ('\n python 路径为',sys.path)
导入 sys 模块的 argv,path 成员
from sys import argv,path # 导入特定的成员
print('================python from import===================================')
print('path:',path) # 因为已经导入path成员,所以此处引用时不需要加sys.path
二.基本数据类型
1.变量和赋值
Python 中的变量不需要声明
。每个变量在使用前都必须赋值
,变量赋值以后该变量才会被创建。
-
在 Python 中,变量就是变量,
它没有类型
,我们所说的"类型"是变量所指的内存中对象的类型
。- 等号(=)用来给变量赋值。
counter = 100 # 整型变量
miles = 1000.0 # 浮点型变量
name = "runoob" # 字符串
print (counter)
print (miles)
print (name)
2.多个变量赋值
Python允许你同时为多个变量赋值。例如:
a = b = c = 1
以上实例,创建一个整型对象,值为 1,从后向前赋值,三个变量被赋予相同的数值。
您也可以为多个对象指定多个变量。例如:
a, b, c = 1, 2, "run"
以上实例,两个整型对象 1 和 2 的分配给变量 a 和 b,字符串对象 “run” 分配给变量 c。
3.标准数据类型
- Number(数字)
- String(字符串)
- bool(布尔类型)
- List(列表)
- Tuple(元组)
- Set(集合)
- Dictionary(字典)
Python3 的六个标准数据类型中:
- 不可变数据(3 个):Number(数字)、String(字符串)、Tuple(元组);
- 可变数据(3 个):List(列表)、Dictionary(字典)、Set(集合)。
4.Number(数字)
Python3 支持 int、float、bool、complex(复数)。
a, b, c, d = 20, 5.5, True, 4+3j
5.数值运算
5 + 4 # 加法
9
4.3 - 2 # 减法
2.3
3 * 7 # 乘法
21
2 / 4 # 除法,得到一个浮点数
0.5
2 // 4 # 除法,得到一个整数
0
17 % 3 # 取余
2
2 ** 5 # 乘方
32
6.String(字符串)
Python中的字符串用单引号 ' 或双引号 "
括起来,同时使用反斜杠 \ 转义
特殊字符。
字符串的截取的语法格式如下:
变量[头下标:尾下标]
索引值以 0 为开始值,-1 为从末尾的开始位置。
加号 + 是字符串的连接符
, 星号 * 表示复制当前字符串
,与之结合的数字为复制的次数
。实例如下:
str = 'Runoob'
print (str) # 输出字符串
print (str[0:-1]) # 输出第一个到倒数第二个的所有字符
print (str[0]) # 输出字符串第一个字符
print (str[2:5]) # 输出从第三个开始到第五个的字符
print (str[2:]) # 输出从第三个开始的后的所有字符
print (str * 2) # 输出字符串两次,也可以写成 print (2 * str)
print (str + "TEST") # 连接字符串
执行以上程序会输出如下结果:
Runoob
Runoo
R
noo
noob
RunoobRunoob
RunoobTEST
7.bool(布尔类型)
在 Python 中,True 和 False 都是关键字,表示布尔值。
a = True
b = False
# 比较运算符
print(2 < 3) # True
print(2 == 3) # False
# 逻辑运算符
print(a and b) # False
print(a or b) # True
print(not a) # False
# 类型转换
print(int(a)) # 1
print(float(b)) # 0.0
print(str(a)) # "True"
8.List(列表)
List(列表) 是 Python 中使用最频繁的数据类型。
-
完成大多数集合类的数据结构实现。
-
List写在方括号[]]之间,元素用逗号隔开,它支持数字,字符串甚至可以包含列表(所谓嵌套)。
-
和字符串一样,列表同样可以
被索引和截取,列表被截取后返回一个包含所需元素的新列表
。 -
List中的元素是可以改变的。
列表截取的语法格式如下:
变量[头下标:尾下标]
索引值以 0 为开始值,-1 为从末尾的开始位置。
加号 + 是列表连接运算符,星号 * 是重复操作。如下实例:
list = [ 'abcd', 786 , 2.23, 'runoob', 70.2 ]
tinylist = [123, 'runoob']
print (list) # 输出完整列表
print (list[0]) # 输出列表第一个元素
print (list[1:3]) # 从第二个开始输出到第三个元素
print (list[2:]) # 输出从第三个元素开始的所有元素
print (tinylist * 2) # 输出两次列表
print (list + tinylist) # 连接列表
以上实例输出结果:
['abcd', 786, 2.23, 'runoob', 70.2]
abcd
[786, 2.23]
[2.23, 'runoob', 70.2]
[123, 'runoob', 123, 'runoob']
['abcd', 786, 2.23, 'runoob', 70.2, 123, 'runoob']
与Python字符串不一样的是,列表中的元素是可以改变的
:
a = [1, 2, 3, 4, 5, 6]
a[0] = 9
a[2:5] = [13, 14, 15]
a
[9, 2, 13, 14, 15, 6]
a[2:5] = [] # 将对应的元素值设置为 []
a
[9, 2, 6]
Python 列表截取可以接收第3个参数,参数作用是截取的步长
,以下实例在索引 1 到索引 4 的位置并设置为步长为 2(间隔一个位置)来截取字符串:
如果第三个参数为负数表示逆向读取,以下实例用于翻转字符串:
def reverseWords(input):
# 通过空格将字符串分隔符,把各个单词分隔为列表
inputWords = input.split(" ")
# 翻转字符串
# 假设列表 list = [1,2,3,4],
# list[0]=1, list[1]=2 ,而 -1 表示最后一个元素 list[-1]=4 ( 与 list[3]=4 一样)
# inputWords[-1::-1] 有三个参数
# 第一个参数 -1 表示最后一个元素
# 第二个参数为空,表示移动到列表末尾
# 第三个参数为步长,-1 表示逆向
inputWords=inputWords[-1::-1]
# 重新组合字符串
output = ' '.join(inputWords)
return output
if __name__ == "__main__":
input = 'I like runoob'
rw = reverseWords(input)
print(rw)
输出结果
runoob like I
9.Tuple(元组)
- 元组(tuple)与
列
表类似,不同之处在于元组的元素不能修改。元组写在小括号 () 里,元素之间用逗号隔开。 - 元组中的元素类型也可以不相同:
- 元组也可以被
索引和切片
,方法一样。 - 注意构造包含 0 或 1 个元素的元组的特殊语法规则。
- 元组也可以使用
+操作
符进行拼接。
tuple = ( 'abcd', 786 , 2.23, 'runoob', 70.2 )
tinytuple = (123, 'runoob')
print (tuple) # 输出完整元组
print (tuple[0]) # 输出元组的第一个元素
print (tuple[1:3]) # 输出从第二个元素开始到第三个元素
print (tuple[2:]) # 输出从第三个元素开始的所有元素
print (tinytuple * 2) # 输出两次元组
print (tuple + tinytuple) # 连接元组
结果
('abcd', 786, 2.23, 'runoob', 70.2)
abcd
(786, 2.23)
(2.23, 'runoob', 70.2)
(123, 'runoob', 123, 'runoob')
('abcd', 786, 2.23, 'runoob', 70.2, 123, 'runoob')
元组与字符串类似,可以被索引且下标索引从0开始,-1 为从末尾开始的位置。也可以进行截取 其实,可以把字符串看作一种特殊的元组。
10.Set(集合)
-
Python 中的集合(Set)是一种
无序、可变
的数据类型,用于存储唯一的元素
。- 集合中的元素不会重复,并且可以进行
交集、并集、差集
等常见的集合操作。
- 集合中的元素不会重复,并且可以进行
-
在 Python 中,集合使用
大括号 {}
表示,元素之间用逗号 , 分隔
。- 另外,也可以使用 set() 函数创建集合。
注意:创建一个空集合必须用 set()
而不是 { }
,因为{ }
是用来创建一个空字典。
创建格式:
parame = {value01,value02,...}
# 或者
set(value)
sites = {'Google', 'Taobao', 'Runoob', 'Facebook', 'Zhihu', 'Baidu'}
print(sites) # 输出集合,重复的元素被自动去掉
# 成员测试
if 'Runoob' in sites :
print('Runoob 在集合中')
else :
print('Runoob 不在集合中')
# set可以进行集合运算
a = set('abracadabra')
b = set('alacazam')
print(a)
print(a - b) # a 和 b 的差集
print(a | b) # a 和 b 的并集
print(a & b) # a 和 b 的交集
print(a ^ b) # a 和 b 中不同时存在的元素
结果
{'Zhihu', 'Baidu', 'Taobao', 'Runoob', 'Google', 'Facebook'}
Runoob 在集合中
{'b', 'c', 'a', 'r', 'd'}
{'r', 'b', 'd'}
{'b', 'c', 'a', 'z', 'm', 'r', 'l', 'd'}
{'c', 'a'}
{'z', 'b', 'm', 'r', 'l', 'd'}
11.Dictionary(字典)
-
列表是有序的对象集合,字典是
无序的对象集合
。两者之间的区别在于:字典当中的元素是通过key来存取的,而不是通过偏移存取
。-
字典是一种映射类型,
字典用 { } 标识
,它是一个无序的 键(key) : 值(value) 的集合
。 -
键(key)必须使用不可变类型。
-
在同一个字典中,键(key)必须是唯一的。
-
dict = {}
dict['one'] = "1 - 菜鸟教程"
dict[2] = "2 - 菜鸟工具"
tinydict = {'name': 'runoob','code':1, 'site': 'www.runoob.com'}
print (dict['one']) # 输出键为 'one' 的值
print (dict[2]) # 输出键为 2 的值
print (tinydict) # 输出完整的字典
print (tinydict.keys()) # 输出所有键
print (tinydict.values()) # 输出所有值
结果
1 - 菜鸟教程
2 - 菜鸟工具
{'name': 'runoob', 'code': 1, 'site': 'www.runoob.com'}
dict_keys(['name', 'code', 'site'])
dict_values(['runoob', 1, 'www.runoob.com'])
构造函数 dict()
可以直接从键值对序列中构建字典如下:
dict([('Runoob', 1), ('Google', 2), ('Taobao', 3)])
#{'Runoob': 1, 'Google': 2, 'Taobao': 3}
{x: x**2 for x in (2, 4, 6)}
#{2: 4, 4: 16, 6: 36}
dict(Runoob=1, Google=2, Taobao=3)
#{'Runoob': 1, 'Google': 2, 'Taobao': 3}
12.Python数据类型转换
隐式类型转换
- 在隐式类型转换中,Python 会自动将一种数据类型转换为另一种数据类型,不需要我们去干预。
- 对两种不同类型的数据进行运算,较低数据类型(整数)就会转换为较高数据类型(浮点数)以避免数据丢失。
num_int = 123 num_flo = 1.23 num_new = num_int + num_flo print("num_int 数据类型为:",type(num_int)) print("num_flo 数据类型为:",type(num_flo)) print("num_new 值为:",num_new) print("num_new 数据类型为:",type(num_new))
显式类型转换
在显式类型转换中,用户将对象的数据类型转换为所需的数据类型。 我们使用 int()、float()、str()
等函数来执行显式类型转换。
#int() 强制转换为整型:
x = int(1) # x 输出结果为 1
y = int(2.8) # y 输出结果为 2
z = int("3") # z 输出结果为 3
#float() 强制转换为浮点型:
x = float(1) # x 输出结果为 1.0
y = float(2.8) # y 输出结果为 2.8
z = float("3") # z 输出结果为 3.0
w = float("4.2") # w 输出结果为 4.2
#str() 强制转换为字符串类型:
x = str("s1") # x 输出结果为 's1'
y = str(2) # y 输出结果为 '2'
z = str(3.0) # z 输出结果为 '3.0'
三.运算符
四.条件判断
1.if 语句
- 每个条件后面要使用
冒号 :
,表示接下来是满足条件后要执行的语句块。 - 使用缩进来划分语句块,相同缩进数的语句在一起组成一个语句块。
- 在 Python 中没有 switch…case 语句,但在 Python3.10 版本添加了 match…case,功能也类似,详见下文。
if condition_1:
statement_block_1
elif condition_2:
statement_block_2
else:
statement_block_3
实例
var1 = 100
if var1:
print ("1 - if 表达式条件为 true")
print (var1)
var2 = 0
if var2:
print ("2 - if 表达式条件为 true")
print (var2)
print ("Good bye!")
结果
1 - if 表达式条件为 true
100
Good bye!
2.if 嵌套
在嵌套 if 语句中,可以把 if...elif...else
结构放在另外一个 if…elif…else 结构中。
if 表达式1:
语句
if 表达式2:
语句
elif 表达式3:
语句
else:
语句
elif 表达式4:
语句
else:
语句
实例
num=int(input("输入一个数字:"))
if num%2==0:
if num%3==0:
print ("你输入的数字可以整除 2 和 3")
else:
print ("你输入的数字可以整除 2,但不能整除 3")
else:
if num%3==0:
print ("你输入的数字可以整除 3,但不能整除 2")
else:
print ("你输入的数字不能整除 2 和 3")
3.match…case
match subject:
case <pattern_1>:
<action_1>
case <pattern_2>:
<action_2>
case <pattern_3>:
<action_3>
case _:
<action_wildcard>
case _: 类似于 C 和 Java 中的 default
:,当其他 case 都无法匹配时,匹配这条,保证永远会匹配成功。
例如
def http_error(status):
match status:
case 400:
return "Bad request"
case 404:
return "Not found"
case 418:
return "I'm a teapot"
case _:
return "Something's wrong with the internet"
mystatus=400
print(http_error(400))
五.循环
1.while 循环
语法
while 判断条件(condition):
执行语句(statements)……
实例
n = 100
sum = 0
counter = 1
while counter <= n:
sum = sum + counter
counter += 1
print("1 到 %d 之和为: %d" % (n,sum))
结果
1 到 100 之和为: 5050
2.无限循环
可以通过设置条件表达式永远不为 false 来实现无限循环
,实例如下:
var = 1
while var == 1 : # 表达式永远为 true
num = int(input("输入一个数字 :"))
print ("你输入的数字是: ", num)
print ("Good bye!")
输入一个数字 :5
你输入的数字是: 5
输入一个数字 :
- 你可以使用 CTRL+C 来退出当前的无限循环。
- 无限循环在服务器上客户端的实时请求非常有用。
3.while 循环使用 else 语句
类似 if 语句的语法,如果你的 while 循环体中只有一条语句,你可以将该语句与 while 写在同一行中, 如下所示:
flag = 1
while (flag): print ('欢迎访问百度!')
print ("Good bye!")
注意:以上的无限循环你可以使用 CTRL+C 来中断循环。
欢迎访问百度教程!
欢迎访问百度教程!
欢迎访问百度教程!
欢迎访问百度教程!
欢迎访问百度教程!
……
4.简单语句组
5.for循环
Python for 循环可以遍历任何可迭代对象
,如一个列表或者一个字符串。
语法
for <variable> in <sequence>:
<statements>
else:
<statements>
遍历集合
sites = ["Baidu", "Google","Runoob","Taobao"]
for site in sites:
print(site)
结果
Baidu
Google
Runoob
Taobao
打印字符串中的每个字符:
word = 'abc'
for letter in word:
print(letter)
结果
a
b
c
整数范围值可以配合 range() 函数使用:
# 1 到 5 的所有数字:
for number in range(1, 3):
print(number)
结果
1
2
3
6.for…else
在 Python 中,for…else 语句用于在循环结束后执行一段代码
。
语法格式如下:
for item in iterable:
# 循环主体
else:
# 循环结束后执行的代码
- 当循环执行完毕后,会执行
else 子句
中的代码,如果在循环过程中遇到了break 语句,则会中断循环
,此时不会执行 else 子句。
for x in range(3):
print(x)
else:
print("Finally finished!")
0
1
2
3
Finally finished!
sites = ["Baidu", "Google","Runoob","Taobao"]
for site in sites:
if site == "Runoob":
print("菜鸟教程!")
break
print("循环数据 " + site)
else:
print("没有循环数据!")
print("完成循环!")
结果
循环数据 Baidu
循环数据 Google
菜鸟教程!
完成循环!
7.range() 函数
如果你需要遍历数字,可以使用内置 range() 函数。它会生成数列,例如:
for i in range(5):
print(i)
0
1
2
3
4
也可以使用 range() 指定区间
的值
for i in range(5,9) :
print(i)
5
6
7
8
也可以使 range() 以指定数字开始并指定不同的增量(甚至可以是负数,有时这也叫做'步长'):
for i in range(0, 10, 3) :
print(i)
0
3
6
9
负数
for i in range(-10, -100, -30) :
print(i)
-10
-40
-70
可以结合range() 和 len()
函数以遍历一个序列的索引
a = ['Google', 'Baidu', 'Runoob', 'Taobao', 'QQ']
for i in range(len(a)):
print(i, a[i])
0 Google
1 Baidu
2 Runoob
3 Taobao
4 QQ
8.break 和 continue 语句及循环中的 else 子句
-
break 语句可以跳出 for 和 while 的循环体。如果你从 for 或 while 循环中终止,任何对应的循环 else 块将不执行。
-
continue 语句被用来告诉 Python 跳过当前循环块中的剩余语句,然后继续进行下一轮循环。
while 中使用 break:
n = 5
while n > 0:
n -= 1
if n == 2:
break
print(n)
print('循环结束。')
4
3
循环结束。
while 中使用 continue :
n = 5
while n > 0:
n -= 1
if n == 2:
continue
print(n)
print('循环结束。')
4
3
1
0
循环结束。
9.pass 语句
-
Python pass是空语句,是为了保持程序结构的完整性。
-
pass 不做任何事情,一般用做占位语句,如下实例
for letter in 'baidu':
if letter == 'i':
pass
print ('执行 pass 块')
print ('当前字母 :', letter)
print ("Good bye!")
当前字母 : b
当前字母 : a
当前字母 : i
执行 pass 块
当前字母 : d
当前字母 : u
Good bye!