人生苦短,我用 Python —— Life is short, you need Python
Python 的创始人为吉多·范罗苏姆(Guido van Rossum)
计算机不能直接理解任何除机器语言以外的语言,所以必须要把程序员所写的程序语言翻译成机器语言,计算机才能执行程序。 将其他语言翻译成机器语言的工具,被称为编译器
编译器翻译的方式有两种:一个是 编译 ,另外一个是 解释 。两种方式之间的区别在于 翻译时间点的不同 。当编译器 以解释方式运行的时候 ,也称之为 解释器
1999 年,吉多·范罗苏姆向 DARPA 提交了一条名为 “Computer Programming for Everybody” 的资金申请,并在后来说明了他对 Python 的目标:
这些想法中的基本都已经成为现实,Python 已经成为一门流行的编程语言
在 Python 社区,吉多被称为“仁慈的独裁者”
同一样问题,用不同的语言解决,代码量差距还是很多的,一般情况下 Python
是 Java
的 1/5,所以说 人生苦短,我用 Python
C
或C++
编写,然后在 Python
程序中使用它们#
开头, #
右边的所有东西都被当做说明文字,而不是真正要执行的程序,只起到辅助说明作用# 这是第一个单行注释
print("hello python")
为了保证代码的可读性, #
后面建议先添加一个空格,然后再编写相应的说明文字
#
在代码的后面(旁边)增加说明性的文字print("hello python") # 输出 `hello python`
"""
这是一个多行注释
在多行注释之间,可以写很多很多的内容……
"""
print("hello python")
在一些正规的开发团队,通常会有 代码审核 的惯例,就是一个团队中彼此阅读对方的代码
Python
官方提供有一系列 PEP(Python Enhancement Proposals) 文档任何语言的程序员,编写出符合规范的代码,是开始程序生涯的第一步
计算机,顾名思义就是负责进行 数学计算 并且 存储计算结果 的电子设备
data-draft-node="block" data-draft-type="table" data-size="normal" data-row-style="normal">
运算符 | 描述 | 实例 |
---|
*
运算符还可以用于字符串,计算结果就是字符串重复指定次数的结果In [1]: "-" * 50
Out[1]: '----------------------------------------'
()
调整计算的优先级e data-draft-node="block" data-draft-type="table" data-size="normal" data-row-style="normal">
变量名 = 值
变量定义之后,后续就可以直接使用了
# 定义 qq_number 的变量用来保存 qq 号码
In [1]: qq_number = "1234567"
# 输出 qq_number 中保存的内容
In [2]: qq_number
Out[2]: '1234567'
# 定义 qq_password 的变量用来保存 qq 密码
In [3]: qq_password = "123"
# 输出 qq_password 中保存的内容
In [4]: qq_password
Out[4]: '123'
使用交互式方式,如果要查看变量内容,直接输入变量名即可,不需要使用 print
函数
# 定义 qq 号码变量
qq_number = "1234567"
# 定义 qq 密码变量
qq_password = "123"
# 在程序中,如果要输出变量的内容,需要使用 print 函数
print(qq_number)
print(qq_password)
使用解释器执行,如果要输出变量的内容,必须要要使用 print
函数
# 定义苹果价格变量
price = 8.5
# 定义购买重量
weight = 7.5
# 计算金额
money = price * weight
print(money)
# 定义苹果价格变量
price = 8.5
# 定义购买重量
weight = 7.5
# 计算金额
money = price * weight
# 只要买苹果就返 5 元
money = money - 5
print(money)
price
/ weight
/ money
money = money - 5
是在定义新的变量还是在使用变量?
利用 单步调试 确认变量中保存数据的类型
Python
中定义变量时需要指定类型吗?Python
可以根据 =
等号右侧的值,自动推导出变量中存储数据的类型Python
中定义变量是 不需要指定类型 (在其他很多高级语言中都需要)int
)float
)bool
)
True
非 0 数
—— 非零即真False
0
complex
)
提示:在 Python 2.x 中, 整数 根据保存数值的长度还分为:
int long
type
函数可以查看一个变量的类型In [1]: type(name)
bool
型,在计算时
True
对应的数字是 1
False
对应的数字是 0
i = 10
f = 10.5
b = True
+
拼接字符串+
拼接生成新的字符串In [1]: first_name = "三"
In [2]: last_name = "张"
In [3]: first_name + last_name
Out[3]: '三张'
*
重复拼接相同的字符串In [1]: "-" * 50
Out[1]: '--------------------------------------------------'
In [1]: first_name = "zhang"
In [2]: x = 10
In [3]: x + first_name
---------------------------------------------------------------------------
TypeError: unsupported operand type(s) for +: 'int' and 'str'
类型错误:`+` 不支持的操作类型:`int` 和 `str`
input
函数le data-draft-node="block" data-draft-type="table" data-size="normal" data-row-style="normal">
input
函数从键盘等待用户的输入字符串变量 = input("提示信息:")
le data-draft-node="block" data-draft-type="table" data-size="normal" data-row-style="normal">
# 1. 输入苹果单价
price_str = input("请输入苹果价格:")
# 2. 要求苹果重量
weight_str = input("请输入苹果重量:")
# 3. 计算金额
# 1> 将苹果单价转换成小数
price = float(price_str)
# 2> 将苹果重量转换成小数
weight = float(weight_str)
# 3> 计算付款金额
money = price * weight
print(money)
price_str
记录用户输入的价格字符串price
记录转换后的价格数值float
函数进行转换price = float(input("请输入价格:"))
苹果单价 9.00
元/斤,购买了 5.00
斤,需要支付 45.00
元
print
函数将信息输出到控制台%
被称为 格式化操作符 ,专门用于处理字符串中的格式
%
的字符串,被称为 格式化字符串%
和不同的 字符 连用, 不同类型的数据 需要使用 不同的格式化字符print("格式化字符串" % 变量1)
print("格式化字符串" % (变量1, 变量2...))
name
,输出 我的名字叫 小明,请多多关照!student_no
,输出 我的学号是 000001price
、 weight
、 money
,输出 苹果单价 9.00 元/斤,购买了 5.00 斤,需要支付 45.00 元scale
,输出 数据比例是 10.00%print("我的名字叫 %s,请多多关照!" % name)
print("我的学号是 %06d" % student_no)
print("苹果单价 %.02f 元/斤,购买 %.02f 斤,需要支付 %.02f 元" % (price, weight, money))
print("数据比例是 %.02f%%" % (scale * 100))
**************************************************
公司名称
姓名 (职位)
电话:电话
邮箱:邮箱
**************************************************
实现代码如下:
"""
在控制台依次提示用户输入:姓名、公司、职位、电话、电子邮箱
"""
name = input("请输入姓名:")
company = input("请输入公司:")
title = input("请输入职位:")
phone = input("请输入电话:")
email = input("请输入邮箱:")
print("*" * 50)
print(company)
print()
print("%s (%s)" % (name, title))
print()
print("电话:%s" % phone)
print("邮箱:%s" % email)
print("*" * 50)
标示符就是程序员定义的 变量名 、 函数名
名字需要有 见名知义 的效果,见下图:
思考:下面的标示符哪些是正确的,哪些不正确为什么?
fromNo12
from#12
my_Boolean
my-Boolean
Obj2
2ndObj
myInt
My_tExt
_test
test!32
haha(da)tt
jack_rose
jack&rose
GUI
G.U.I
Python
内部已经使用的标识符通过以下命令可以查看 Python
中的关键字
In [1]: import keyword
In [2]: print(keyword.kwlist)
提示: 关键字的学习及使用 ,会在后面的课程中不断介绍
import
关键字 可以导入一个 “工具包”Python
中不同的工具包,提供有不同的工具命名规则可以被视为一种 惯例 ,并无绝对与强制
目的是为了 增加代码的识别和可读性
注意 Python
中的 标识符 是 区分大小写的
=
的左右应该各保留一个空格Python
中,如果 变量名 需要由 二个 或 多个单词 组成时,可以按照以下方式命名
_
下划线 连接first_name
、 last_name
、 qq_number
、 qq_password
firstName
、 lastName
FirstName
、 LastName
、 CamelCase
生活中的判断几乎是无所不在的,我们每天都在做各种各样的选择,如果这样?如果那样?……
if 今天发工资:
先还信用卡的钱
if 有剩余:
又可以happy了,O(∩_∩)O哈哈~
else:
噢,no。。。还的等30天
else:
盼着发工资
正是因为有了判断,才使得程序世界丰富多彩,充满变化!
判断语句又被称为 “分支语句”,正是因为有了判断,才让程序有了很多的分支
在 Python
中, if 语句 就是用来进行判断的,格式如下:
if 要判断的条件:
条件成立时,要做的事情
……
注意:代码的缩进为一个 tab
键,或者 4 个空格 —— 建议使用空格
# 1. 定义年龄变量
age = 18
# 2. 判断是否满 18 岁
# if 语句以及缩进部分的代码是一个完整的代码块
if age >= 18:
print("可以进网吧嗨皮……")
# 3. 思考!- 无论条件是否满足都会执行
print("这句代码什么时候执行?")
if
语句以及缩进部分是一个 完整的代码块在使用 if
判断时,只能做到满足条件时要做的事情。那如果需要在 不满足条件的时候 ,做某些事情,该如何做呢?
else
,格式如下:
if 要判断的条件:
条件成立时,要做的事情
……
else:
条件不成立时,要做的事情
……
if
和 else
语句以及各自的缩进部分共同是一个 完整的代码块# 1. 输入用户年龄
age = int(input("今年多大了?"))
# 2. 判断是否满 18 岁
# if 语句以及缩进部分的代码是一个完整的语法块
if age >= 18:
print("可以进网吧嗨皮……")
else:
print("你还没长大,应该回家写作业!")
# 3. 思考!- 无论条件是否满足都会执行
print("这句代码什么时候执行?")
and
条件1 and 条件2
True
False
a-draft-node="block" data-draft-type="table" data-size="normal" data-row-style="normal">
条件 1 | 条件 2 | 结果 |
---|
or
条件1 or 条件2
True
False
a-draft-node="block" data-draft-type="table" data-size="normal" data-row-style="normal">
条件 1 | 条件 2 | 结果 |
---|
not
not 条件
le data-draft-node="block" data-draft-type="table" data-size="normal" data-row-style="normal">
age
,编写代码判断年龄是否正确python_score
、 c_score
,编写代码判断成绩is_employee
,编写代码判断是否是本公司员工答案 1:
# 练习1: 定义一个整数变量 age,编写代码判断年龄是否正确
age = 100
# 要求人的年龄在 0-120 之间
if age >= 0 and age <= 120:
print("年龄正确")
else:
print("年龄不正确")
答案 2:
# 练习2: 定义两个整数变量 python_score、c_score,编写代码判断成绩
python_score = 50
c_score = 50
# 要求只要有一门成绩 > 60 分就算合格
if python_score > 60 or c_score > 60:
print("考试通过")
else:
print("再接再厉!")
答案 3:
# 练习3: 定义一个布尔型变量 `is_employee`,编写代码判断是否是本公司员工
is_employee = True
# 如果不是提示不允许入内
if not is_employee:
print("非公勿内")
elif
if
可以 判断条件else
可以处理 条件不成立 的情况elif
if 条件1:
条件1满足执行的代码
……
elif 条件2:
条件2满足时,执行的代码
……
elif 条件3:
条件3满足时,执行的代码
……
else:
以上条件都不满足时,执行的代码
……
if 条件1 and 条件2:
条件1满足 并且 条件2满足 执行的代码
……
elif
和 else
都必须和 if
联合使用,而不能单独使用if
、 elif
和 else
以及各自缩进的代码,看成一个 完整的代码块holiday_name
字符串变量记录节日名称holiday_name = "平安夜"
if holiday_name == "情人节":
print("买玫瑰")
print("看电影")
elif holiday_name == "平安夜":
print("买苹果")
print("吃大餐")
elif holiday_name == "生日":
print("买蛋糕")
else:
print("每天都是节日啊……")
if
的嵌套elif的应用场景是: 同时 判断 多个条件 ,所有的条件是 平级 的
if
进行条件判断,如果希望 在条件成立的执行语句中 再 增加条件判断 ,就可以使用 if 的嵌套if 条件 1:
条件 1 满足执行的代码
……
if 条件 1 基础上的条件 2:
条件 2 满足时,执行的代码
……
# 条件 2 不满足的处理
else:
条件 2 不满足时,执行的代码
# 条件 1 不满足的处理
else:
条件1 不满足时,执行的代码
……
has_ticket
表示是否有车票knife_length
表示刀的长度,单位:厘米# 定义布尔型变量 has_ticket 表示是否有车票
has_ticket = True
# 定义整数型变量 knife_length 表示刀的长度,单位:厘米
knife_length = 20
# 首先检查是否有车票,如果有,才允许进行 安检
if has_ticket:
print("有车票,可以开始安检...")
# 安检时,需要检查刀的长度,判断是否超过 20 厘米
# 如果超过 20 厘米,提示刀的长度,不允许上车
if knife_length >= 20:
print("不允许携带 %d 厘米长的刀上车" % knife_length)
# 如果不超过 20 厘米,安检通过
else:
print("安检通过,祝您旅途愉快……")
# 如果没有车票,不允许进门
else:
print("大哥,您要先买票啊")
import
导入模块(“工具包”)的使用le data-draft-node="block" data-draft-type="table" data-size="normal" data-row-style="normal">
# 从控制台输入要出的拳 —— 石头(1)/剪刀(2)/布(3)
player = int(input("请出拳 石头(1)/剪刀(2)/布(3):"))
# 电脑 随机 出拳 - 假定电脑永远出石头
computer = 1
# 比较胜负
# 如果条件判断的内容太长,可以在最外侧的条件增加一对大括号
# 再在每一个条件之间,使用回车,PyCharm 可以自动增加 8 个空格
if ((player == 1 and computer == 2) or
(player == 2 and computer == 3) or
(player == 3 and computer == 1)):
print("噢耶!!!电脑弱爆了!!!")
elif player == computer:
print("心有灵犀,再来一盘!")
else:
print("不行,我要和你决战到天亮!")
Python
中,要使用随机数,首先需要导入 随机数 的 模块 —— “工具包”import random
.
然后按 Tab
键,会提示该模块中包含的所有函数random.randint(a, b)
,返回 [a, b]
之间的整数,包含 a
和 b
random.randint(12, 20) # 生成的随机数n: 12 <= n <= 20
random.randint(20, 20) # 结果永远是 20
random.randint(20, 10) # 该语句是错误的,下限必须小于上限
数学符号表链接: https://zh.wikipedia.org/wiki/数学符号表
data-draft-node="block" data-draft-type="table" data-size="normal" data-row-style="normal">
运算符 | 描述 | 实例 |
---|
*
运算符还可以用于字符串,计算结果就是字符串重复指定次数的结果In [1]: "-" * 50
Out[1]: '----------------------------------------'
e data-draft-node="block" data-draft-type="table" data-size="normal" data-row-style="normal">
Python 2.x 中判断 不等于 还可以使用 <>
运算符
!=
在 Python 2.x 中同样可以用来判断 不等于
a-draft-node="block" data-draft-type="table" data-size="normal" data-row-style="normal">
运算符 | 逻辑表达式 | 描述 |
---|
运算符 | 逻辑表达式 | 描述 |
---|
运算符 | 逻辑表达式 | 描述 |
---|
运算符 | 逻辑表达式 | 描述 |
---|
=
可以给变量赋值Python
还提供了一系列的 与 算术运算符 对应的 赋值运算符data-draft-node="block" data-draft-type="table" data-size="normal" data-row-style="normal">
运算符 | 描述 | 实例 |
---|
e data-draft-node="block" data-draft-type="table" data-size="normal" data-row-style="normal">
while
循环基本使用while
循环最常用的应用场景就是 让执行的代码 按照 指定的次数重复 执行Hello Python
while
语句基本语法初始条件设置 —— 通常是重复执行的 计数器
while 条件(判断 计数器 是否达到 目标次数):
条件满足时,做的事情1
条件满足时,做的事情2
条件满足时,做的事情3
...(省略)...
处理条件(计数器 + 1)
while
语句以及缩进部分是一个 完整的代码块while
# 1. 定义重复次数计数器
i = 1
# 2. 使用 while 判断条件
while i <= 5:
# 要重复执行的代码
print("Hello Python")
# 处理计数器 i
i = i + 1
print("循环结束后的 i = %d" % i)
注意:循环结束后,之前定义的计数器条件的数值是依旧存在的
由于程序员的原因, 忘记 在循环内部 修改循环的判断条件 ,导致循环持续执行,程序无法终止!
=
可以给变量赋值Python
还提供了一系列的 与 算术运算符 对应的 赋值运算符data-draft-node="block" data-draft-type="table" data-size="normal" data-row-style="normal">
运算符 | 描述 | 实例 |
---|
常见的计数方法有两种,可以分别称为:
1
开始)—— 更符合人类的习惯0
开始)—— 几乎所有的程序语言都选择从 0 开始计数因此,大家在编写程序时,应该尽量养成习惯: 除非需求的特殊要求,否则 循环 的计数都从 0 开始
在程序开发中,通常会遇到 利用循环 重复计算 的需求
遇到这种需求,可以:
while
上方定义一个变量,用于 存放最终计算结果# 计算 0 ~ 100 之间所有数字的累计求和结果
# 0. 定义最终结果的变量
result = 0
# 1. 定义一个整数的变量记录循环的次数
i = 0
# 2. 开始循环
while i <= 100:
print(i)
# 每一次循环,都让 result 这个变量和 i 这个计数器相加
result += i
# 处理计数器
i += 1
print("0~100之间的数字求和结果 = %d" % result)
开发步骤
# 0. 最终结果
result = 0
# 1. 计数器
i = 0
# 2. 开始循环
while i <= 100:
# 判断偶数
if i % 2 == 0:
print(i)
result += i
# 处理计数器
i += 1
print("0~100之间偶数求和结果 = %d" % result)
break
和 continue
是专门在循环中使用的关键字
break
某一条件满足时 ,退出循环,不再执行后续重复的代码continue
某一条件满足时 ,不执行后续重复的代码break
和 continue
只针对 当前所在循环 有效
break
退出循环i = 0
while i < 10:
# break 某一条件满足时,退出循环,不再执行后续重复的代码
# i == 3
if i == 3:
break
print(i)
i += 1
print("over")
break
只针对当前所在循环有效
continue
i = 0
while i < 10:
# 当 i == 7 时,不希望执行需要重复执行的代码
if i == 7:
# 在使用 continue 之前,同样应该修改计数器
# 否则会出现死循环
i += 1
continue
# 重复执行的代码
print(i)
i += 1
continue
时, 条件处理部分的代码,需要特别注意 ,不小心会出现 死循环continue
只针对当前所在循环有效
while
循环嵌套while
嵌套就是: while
里面还有 while
while 条件 1:
条件满足时,做的事情1
条件满足时,做的事情2
条件满足时,做的事情3
...(省略)...
while 条件 2:
条件满足时,做的事情1
条件满足时,做的事情2
条件满足时,做的事情3
...(省略)...
处理条件 2
处理条件 1
*
,每一行星号的数量依次递增*
**
***
****
*****
# 1. 定义一个计数器变量,从数字1开始,循环会比较方便
row = 1
while row <= 5:
print("*" * row)
row += 1
知识点对 print
函数的使用做一个增强
print
函数输出内容之后,会自动在内容末尾增加换行print
函数输出内容的后面增加 , end=""
""
中间可以指定 print
函数输出内容之后,继续希望显示的内容# 向控制台输出内容结束之后,不会换行
print("*", end="")
# 单纯的换行
print("")
end=""
表示向控制台输出内容结束之后,不会换行
假设 Python
没有提供 字符串的 *
操作 拼接字符串
*
,每一行星号的数量依次递增*
**
***
****
*****
*
应该如何处理?列row = 1
while row <= 5:
# 假设 python 没有提供字符串 * 操作
# 在循环内部,再增加一个循环,实现每一行的 星星 打印
col = 1
while col <= row:
print("*", end="")
col += 1
# 每一行星号输出完成后,再增加一个换行
print("")
row += 1
需求输出 九九乘法表,格式如下:
1 * 1 = 1
1 * 2 = 2 2 * 2 = 4
1 * 3 = 3 2 * 3 = 6 3 * 3 = 9
1 * 4 = 4 2 * 4 = 8 3 * 4 = 12 4 * 4 = 16
1 * 5 = 5 2 * 5 = 10 3 * 5 = 15 4 * 5 = 20 5 * 5 = 25
1 * 6 = 6 2 * 6 = 12 3 * 6 = 18 4 * 6 = 24 5 * 6 = 30 6 * 6 = 36
1 * 7 = 7 2 * 7 = 14 3 * 7 = 21 4 * 7 = 28 5 * 7 = 35 6 * 7 = 42 7 * 7 = 49
1 * 8 = 8 2 * 8 = 16 3 * 8 = 24 4 * 8 = 32 5 * 8 = 40 6 * 8 = 48 7 * 8 = 56 8 * 8 = 64
1 * 9 = 9 2 * 9 = 18 3 * 9 = 27 4 * 9 = 36 5 * 9 = 45 6 * 9 = 54 7 * 9 = 63 8 * 9 = 72 9 * 9 = 81
*
**
***
****
*****
******
*******
********
*********
*
替换成对应的行与列相乘# 定义起始行
row = 1
# 最大打印 9 行
while row <= 9:
# 定义起始列
col = 1
# 最大打印 row 列
while col <= row:
# end = "",表示输出结束后,不换行
# "\t" 可以在控制台输出一个制表符,协助在输出文本时对齐
print("%d * %d = %d" % (col, row, row * col), end="\t")
# 列数 + 1
col += 1
# 一行打印完成的换行
print("")
# 行数 + 1
row += 1
\t
在控制台输出一个 制表符 ,协助在输出文本时 垂直方向 保持对齐\n
在控制台输出一个 换行符制表符的功能是在不使用表格的情况下在 垂直方向 按列对齐文本
data-draft-node="block" data-draft-type="table" data-size="normal" data-row-style="normal">
转义字符 | 描述 |
---|
04_函数
项目multiple_table():
import
导入并且调用函数定义函数的格式如下:
def 函数名():
函数封装的代码
……
def
是英文 define
的缩写调用函数很简单的,通过 函数名()
即可完成对函数的调用
say_hello
的函数,封装三行打招呼的代码name = "小明"
# 解释器知道这里定义了一个函数
def say_hello():
print("hello 1")
print("hello 2")
print("hello 3")
print(name)
# 只有在调用函数时,之前定义的函数才会被执行
# 函数执行完成之后,会重新回到之前的程序中,继续执行后续的代码
say_hello()
print(name)
用 单步执行 F8 和 F7 观察以下代码的执行过程
Python
已经知道函数的存在NameError: name 'say_hello' is not defined
( 名称错误:say_hello 这个名字没有被定义 )CTRL + Q
可以查看函数的说明信息注意:因为 函数体相对比较独立 , 函数定义的上方 ,应该和其他代码(包括注释)保留 两个空行
sum_2_num
的函数演练代码如下:
def sum_2_num():
num1 = 10
num2 = 20
result = num1 + num2
print("%d + %d = %d" % (num1, num2, result))
sum_2_num()
函数只能处理 固定数值 的相加
,
分隔def sum_2_num(num1, num2):
result = num1 + num2
print("%d + %d = %d" % (num1, num2, result))
sum_2_num(50, 20)
return
关键字可以返回结果注意: return
表示返回,后续的代码都不会被执行
def sum_2_num(num1, num2):
"""对两个数字的求和"""
return num1 + num2
# 调用函数,并使用 result 变量接收计算结果
result = sum_2_num(10, 20)
print("计算结果是 %d" % result)
test2
中,调用了另外一个函数 test1
test1
函数时,会先把函数 test1
中的任务都执行完test2
中调用函数 test1
的位置,继续执行后续的代码def test1():
print("*" * 50)
print("test 1")
print("*" * 50)
def test2():
print("-" * 50)
print("test 2")
test1()
print("-" * 50)
test2()
体会一下工作中 需求是多变 的
print_line
函数能够打印 *
组成的 一条分隔线def print_line(char):
print("*" * 50)
def print_line(char):
print(char * 50)
def print_line(char, times):
print(char * times)
提示:工作中针对需求的变化,应该冷静思考, 不要轻易修改之前已经完成的,能够正常执行的函数 !
def print_line(char, times):
print(char * times)
def print_lines(char, times):
row = 0
while row < 5:
print_line(char, times)
row += 1
py
结尾的 Python
源代码文件都是一个 模块hm_10_分隔线模块.py
hm_09_打印多条分隔线.py
中的内容, 最后一行 print
代码除外name = "黑马程序员"
hm_10_体验模块.py
文件,并且编写以下代码:import hm_10_分隔线模块
hm_10_分隔线模块.print_line("-", 80)
print(hm_10_分隔线模块.name)
import
导入这个模块模块名.变量
/ 模块名.函数
的方式,使用这个模块中定义的变量或者函数模块可以让 曾经编写过的代码 方便的被 复用 !
注意:如果在给 Python 文件起名时, 以数字开头 是无法在 PyCharm
中通过导入这个模块的
C
是 compiled
编译过 的意思
__pycache__
的目录hm_10_分隔线模块.cpython-35.pyc
文件, cpython-35
表示 Python
解释器的版本pyc
文件是由 Python 解释器将 模块的源码 转换为 字节码Python
这样保存 字节码 是作为一种启动 速度的优化Python
在解释源程序时是分成两个步骤的Python
重编译时,它会自动检查源文件和字节码文件的时间戳提示:有关模块以及模块的其他导入方式,后续课程还会逐渐展开!
模块是 Python 程序架构的一个核心概念
int
)float
)bool
)
True
非 0 数
—— 非零即真False
0
complex
)
Python
中,所有 非数字型变量 都支持以下特点:sequence
,也可以理解为 容器[]
for in
+
和 重复*
List
(列表) 是 Python
中使用 最频繁 的数据类型,在其他语言中通常叫做 数组[]
定义, 数据 之间使用 ,
分隔0
开始
注意:从列表中取值时,如果 超出索引范围 ,程序会报错
name_list = ["zhangsan", "lisi", "wangwu"]
ipython3
中定义一个 列表 ,例如: name_list = []
name_list.
按下 TAB
键, ipython
会提示 列表 能够使用的 方法 如下:In [1]: name_list.
name_list.append name_list.count name_list.insert name_list.reverse
name_list.clear name_list.extend name_list.pop name_list.sort
name_list.copy name_list.index name_list.remove
ode="block" data-draft-type="table" data-size="normal" data-row-style="normal">
序号 | 分类 | 关键字 / 函数 / 方法 | 说明 |
---|
| | | 列表.append(数据) | 在末尾追加数据
| | | 列表.extend(列表2) | 将列表2 的数据追加到列表 |
| 2 | 修改 | 列表[索引] = 数据 | 修改指定索引的数据 |
| 3 | 删除 | del 列表[索引] | 删除指定索引的数据 |
| | | 列表.remove[数据] | 删除第一个出现的指定数据 |
| | | 列表.pop | 删除末尾数据 |
| | | 列表.pop(索引) | 删除指定索引数据 |
| | | 列表.clear | 清空列表 |
| 4 | 统计 | len(列表) | 列表长度 |
| | | 列表.count(数据) | 数据在列表中出现的次数 |
| 5 | 排序 | 列表.sort() | 升序排序 |
| | | 列表.sort(reverse=True) | 降序排序 |
| | | 列表.reverse() | 逆序、反转 |
del
关键字( delete
) 同样可以删除列表中元素del
关键字本质上是用来 将一个变量从内存中删除的del
关键字将变量从内存中删除,后续的代码就不能再使用这个变量了del name_list[1]
在日常开发中,要从列表删除数据,建议 使用列表提供的方法
In [1]: import keyword
In [2]: print(keyword.kwlist)
In [3]: print(len(keyword.kwlist))
关键字后面不需要使用括号
函数名(参数)
函数需要死记硬背
对象.方法名(参数)
在变量后面输入 .
,然后选择针对这个变量要执行的操作,记忆起来比函数要简单很多
Python
中为了提高列表的遍历效率,专门提供的 迭代 iteration 遍历for
就能够实现迭代遍历# for 循环内部使用的变量 in 列表
for name in name_list:
循环内部针对列表元素进行操作
print(name)
Python
的 列表 中可以 存储不同类型的数据Tuple
(元组)与列表类似,不同之处在于元组的 元素不能修改
Python
开发中,有特定的应用场景,
分隔()
定义0
开始
info_tuple = ("zhangsan", 18, 1.75)
info_tuple = ()
info_tuple = (50, )
ipython3
中定义一个 元组 ,例如: info = ()
info.
按下 TAB
键, ipython
会提示 元组 能够使用的函数如下:info.count info.index
有关 元组 的 常用操作 可以参照上图练习
# for 循环内部使用的变量 in 元组
for item in info:
循环内部针对元组元素进行操作
print(item)
Python
中,可以使用 for
循环遍历所有非数字型类型的变量: 列表 、 元组 、 字典 以及字符串for in
遍历 元组()
本质上就是一个元组info = ("zhangsan", 18)
print("%s 的年龄是 %d" % info)
list
函数可以把元组转换成列表list(元组)
tuple
函数可以把列表转换成元组tuple(列表)
dictionary
(字典) 是 除列表以外Python
之中 最灵活 的数据类型物体
的相关信息{}
定义,
分隔
key
是索引value
是数据:
分隔xiaoming = {"name": "小明",
"age": 18,
"gender": True,
"height": 1.75}
ipython3
中定义一个 字典 ,例如: xiaoming = {}
xiaoming.
按下 TAB
键, ipython
会提示 字典 能够使用的函数如下:In [1]: xiaoming.
xiaoming.clear xiaoming.items xiaoming.setdefault
xiaoming.copy xiaoming.keys xiaoming.update
xiaoming.fromkeys xiaoming.pop xiaoming.values
xiaoming.get xiaoming.popitem
有关 字典 的 常用操作 可以参照上图练习
# for 循环内部使用的 `key 的变量` in 字典
for k in xiaoming:
print("%s: %s" % (k, xiaoming[k]))
提示:在实际开发中,由于字典中每一个键值对保存数据的类型是不同的,所以针对字典的循环遍历需求并不是很多
for in
遍历 字典物体
的相关信息 —— 描述更复杂的数据信息card_list = [{"name": "张三",
"qq": "12345",
"phone": "110"},
{"name": "李四",
"qq": "54321",
"phone": "10086"}
]
"
或者 一对单引号'
定义一个字符串
\"
或者 \'
做字符串的转义,但是在实际开发中:
"
,可以使用 '
定义字符串'
,可以使用 "
定义字符串for
循环遍历 字符串中每一个字符大多数编程语言都是用 "
来定义字符串
string = "Hello Python"
for c in string:
print(c)
ipython3
中定义一个 字符串 ,例如: hello_str = ""
hello_str.
按下 TAB
键, ipython
会提示 字符串 能够使用的 方法 如下:In [1]: hello_str.
hello_str.capitalize hello_str.isidentifier hello_str.rindex
hello_str.casefold hello_str.islower hello_str.rjust
hello_str.center hello_str.isnumeric hello_str.rpartition
hello_str.count hello_str.isprintable hello_str.rsplit
hello_str.encode hello_str.isspace hello_str.rstrip
hello_str.endswith hello_str.istitle hello_str.split
hello_str.expandtabs hello_str.isupper hello_str.splitlines
hello_str.find hello_str.join hello_str.startswith
hello_str.format hello_str.ljust hello_str.strip
hello_str.format_map hello_str.lower hello_str.swapcase
hello_str.index hello_str.lstrip hello_str.title
hello_str.isalnum hello_str.maketrans hello_str.translate
hello_str.isalpha hello_str.partition hello_str.upper
hello_str.isdecimal hello_str.replace hello_str.zfill
hello_str.isdigit hello_str.rfind
提示:正是因为 python 内置提供的方法足够多,才使得在开发时,能够针对字符串进行更加灵活的操作!应对更多的开发需求!
le data-draft-node="block" data-draft-type="table" data-size="normal" data-row-style="normal">
le data-draft-node="block" data-draft-type="table" data-size="normal" data-row-style="normal">
le data-draft-node="block" data-draft-type="table" data-size="normal" data-row-style="normal">
le data-draft-node="block" data-draft-type="table" data-size="normal" data-row-style="normal">
le data-draft-node="block" data-draft-type="table" data-size="normal" data-row-style="normal">
le data-draft-node="block" data-draft-type="table" data-size="normal" data-row-style="normal">
字符串[开始索引:结束索引:步长]
[开始索引, 结束索引)
=> 开始索引 >= 范围 < 结束索引
起始
位开始,到 结束
位的前一位 结束( 不包含结束位本身 )1
,如果连续切片, 数字和冒号都可以省略末尾
的字符串开始
~ 5 位置 的字符串末尾 - 1
的字符串num_str = "0123456789"
# 1. 截取从 2 ~ 5 位置 的字符串
print(num_str[2:6])
# 2. 截取从 2 ~ `末尾` 的字符串
print(num_str[2:])
# 3. 截取从 `开始` ~ 5 位置 的字符串
print(num_str[:6])
# 4. 截取完整的字符串
print(num_str[:])
# 5. 从开始位置,每隔一个字符截取字符串
print(num_str[::2])
# 6. 从索引 1 开始,每隔一个取一个
print(num_str[1::2])
# 倒序切片
# -1 表示倒数第一个字符
print(num_str[-1])
# 7. 截取从 2 ~ `末尾 - 1` 的字符串
print(num_str[2:-1])
# 8. 截取字符串末尾两个字符
print(num_str[-2:])
# 9. 字符串的逆序(面试题)
print(num_str[::-1])
Python 包含了以下内置函数:
data-draft-node="block" data-draft-type="table" data-size="normal" data-row-style="normal">
函数 | 描述 | 备注 |
---|
e="block" data-draft-type="table" data-size="normal" data-row-style="normal">
描述 | Python 表达式 | 结果 | 支持的数据类型 |
---|
运算符 | Python 表达式 | 结果 | 描述 | 支持的数据类型 |
---|
in
在对 字典 操作时,判断的是 字典的键in
和 not in
被称为 成员运算符成员运算符用于 测试 序列中是否包含指定的 成员
注意:在对 字典 操作时,判断的是 字典的键
Python
中完整的 for 循环
的语法如下:for 变量 in 集合:
循环体代码
else:
没有通过 break 退出循环,循环结束后,会执行的代码
students = [
{"name": "阿土",
"age": 20,
"gender": True,
"height": 1.7,
"weight": 75.0},
{"name": "小美",
"age": 19,
"gender": False,
"height": 1.6,
"weight": 45.0},
]
find_name = "阿土"
for stu_dict in students:
print(stu_dict)
# 判断当前遍历的字典中姓名是否为find_name
if stu_dict["name"] == find_name:
print("找到了")
# 如果已经找到,直接退出循环,就不需要再对后续的数据进行比较
break
else:
print("没有找到")
print("循环结束")
综合应用已经学习过的知识点:
**************************************************
欢迎使用【名片管理系统】V1.0
1. 新建名片
2. 显示全部
3. 查询名片
0. 退出系统
**************************************************
cards_main.py
保存 主程序功能代码maincards_tools.py
保存 所有名片功能函数cards_main
中添加一个 无限循环while True:
# TODO(小明) 显示系统菜单
action = input("请选择操作功能:")
print("您选择的操作是:%s" % action)
# 根据用户输入决定后续的操作
if action in ["1", "2", "3"]:
pass
elif action == "0":
print("欢迎再次使用【名片管理系统】")
break
else:
print("输入错误,请重新输入")
if action in ["1", "2", "3"]:
if action == "1" or action == "2" or action == "3":
in
针对 列表 判断,避免使用 or
拼接复杂的逻辑条件int
转换用户输入,可以避免 一旦用户输入的不是数字 ,导致程序运行出错pass
#
后跟上 TODO
,用于标记需要去做的工作# TODO(作者/邮件) 显示系统菜单
cards_tools
中增加四个新函数def show_menu():
"""显示菜单
"""
pass
def new_card():
"""新建名片
"""
print("-" * 50)
print("功能:新建名片")
def show_all():
"""显示全部
"""
print("-" * 50)
print("功能:显示全部")
def search_card():
"""搜索名片
"""
print("-" * 50)
print("功能:搜索名片")
cards_main.py
中使用 import
导入 cards_tools
模块import cards_tools
while
循环的代码如下:import cards_tools
while True:
cards_tools.show_menu()
action = input("请选择操作功能:")
print("您选择的操作是:%s" % action)
# 根据用户输入决定后续的操作
if action in ["1", "2", "3"]:
if action == "1":
cards_tools.new_card()
elif action == "2":
cards_tools.show_all()
elif action == "3":
cards_tools.search_card()
elif action == "0":
print("欢迎再次使用【名片管理系统】")
break
else:
print("输入错误,请重新输入:")
至此: cards_main
中的所有代码全部开发完毕!
show_menu
函数def show_menu():
"""显示菜单
"""
print("*" * 50)
print("欢迎使用【菜单管理系统】V1.0")
print("")
print("1. 新建名片")
print("2. 显示全部")
print("3. 查询名片")
print("")
print("0. 退出系统")
print("*" * 50)
cards_tools
文件的顶部增加一个 列表变量# 所有名片记录的列表
card_list = []
def new_card():
"""新建名片
"""
print("-" * 50)
print("功能:新建名片")
# 1. 提示用户输入名片信息
name = input("请输入姓名:")
phone = input("请输入电话:")
qq = input("请输入 QQ 号码:")
email = input("请输入邮箱:")
# 2. 将用户信息保存到一个字典
card_dict = {"name": name,
"phone": phone,
"qq": qq,
"email": email}
# 3. 将用户字典添加到名片列表
card_list.append(card_dict)
print(card_list)
# 4. 提示添加成功信息
print("成功添加 %s 的名片" % card_dict["name"])
技巧:在 PyCharm
中,可以使用 SHIFT + F6
统一修改变量名
def show_all():
"""显示全部
"""
print("-" * 50)
print("功能:显示全部")
for card_dict in card_list:
print(card_dict)
\t
显示def show_all():
"""显示全部
"""
print("-" * 50)
print("功能:显示全部")
# 打印表头
for name in ["姓名", "电话", "QQ", "邮箱"]:
print(name, end="\t\t")
print("")
# 打印分隔线
print("=" * 50)
for card_dict in card_list:
print("%s\t\t%s\t\t%s\t\t%s" % (card_dict["name"],
card_dict["phone"],
card_dict["qq"],
card_dict["email"]))
def show_all():
"""显示全部
"""
print("-" * 50)
print("功能:显示全部")
# 1. 判断是否有名片记录
if len(card_list) == 0:
print("提示:没有任何名片记录")
return
return
return
def search_card():
"""搜索名片
"""
print("-" * 50)
print("功能:搜索名片")
# 1. 提示要搜索的姓名
find_name = input("请输入要搜索的姓名:")
# 2. 遍历字典
for card_dict in card_list:
if card_dict["name"] == find_name:
print("姓名\t\t\t电话\t\t\tQQ\t\t\t邮箱")
print("-" * 40)
print("%s\t\t\t%s\t\t\t%s\t\t\t%s" % (
card_dict["name"],
card_dict["phone"],
card_dict["qq"],
card_dict["email"]))
print("-" * 40)
# TODO(小明) 针对找到的字典进行后续操作:修改/删除
break
else:
print("没有找到 %s" % find_name)
def deal_card(find_dict):
"""操作搜索到的名片字典
:param find_dict:找到的名片字典
"""
print(find_dict)
action_str = input("请选择要执行的操作 "
"[1] 修改 [2] 删除 [0] 返回上级菜单")
if action == "1":
print("修改")
elif action == "2":
print("删除")
elif action == "2":
card_list.remove(find_dict)
print("删除成功")
if action == "1":
find_dict["name"] = input("请输入姓名:")
find_dict["phone"] = input("请输入电话:")
find_dict["qq"] = input("请输入QQ:")
find_dict["email"] = input("请输入邮件:")
print("%s 的名片修改成功" % find_dict["name"])
input
函数不能满足需求,那么就新定义一个函数 input_card_info
对系统的 input
函数进行扩展def input_card_info(dict_value, tip_message):
"""输入名片信息
:param dict_value: 字典原有值
:param tip_message: 输入提示信息
:return: 如果输入,返回输入内容,否则返回字典原有值
"""
# 1. 提示用户输入内容
result_str = input(tip_message)
# 2. 针对用户的输入进行判断,如果用户输入了内容,直接返回结果
if len(result_str) > 0:
return result_str
# 3. 如果用户没有输入内容,返回 `字典中原有的值`
else:
return dict_value
Shebang
符号( #!
)#!
这个符号叫做 Shebang
或者 Sha-bang
Shebang
通常在 Unix
系统脚本的中 第一行开头 使用which
查询 python3
解释器所在路径$ which python3
#! /usr/bin/python3
$ chmod +x cards_main.py
./cards_main.py
Python
中 函数 的 参数传递 以及 返回值 都是靠 引用 传递的在 Python
中
id()
函数可以查看变量中保存数据所在的 内存地址注意:如果变量已经被定义,当给一个变量赋值的时候,本质上是 修改了数据的引用
变量引用
的示例在 Python
中,变量的名字类似于 便签纸 贴在 数据 上
a
,并且赋值为 1
变量 b
是第 2 个贴在数字 2
上的标签
在 Python
中,函数的 实参 / 返回值 都是是靠 引用 来传递来的
def test(num):
print("-" * 50)
print("%d 在函数内的内存地址是 %x" % (num, id(num)))
result = 100
print("返回值 %d 在内存中的地址是 %x" % (result, id(result)))
print("-" * 50)
return result
a = 10
print("调用函数前 内存地址是 %x" % id(a))
r = test(a)
print("调用函数后 实参内存地址是 %x" % id(a))
print("调用函数后 返回值内存地址是 %x" % id(r))
int
, bool
, float
, complex
, long(2.x)
str
tuple
a = 1
a = "hello"
a = [1, 2, 3]
a = [3, 2, 1]
demo_list = [1, 2, 3]
print("定义列表后的内存地址 %d" % id(demo_list))
demo_list.append(999)
demo_list.pop(0)
demo_list.remove(2)
demo_list[0] = 10
print("修改数据后的内存地址 %d" % id(demo_list))
demo_dict = {"name": "小明"}
print("定义字典后的内存地址 %d" % id(demo_dict))
demo_dict["age"] = 18
demo_dict.pop("name")
demo_dict["name"] = "老王"
print("修改数据后的内存地址 %d" % id(demo_dict))
注意:字典的 key
只能使用不可变类型的数据
(hash)
Python
中内置有一个名字叫做 hash(o)
的函数
哈希
是一种 算法 ,其作用就是提取数据的 特征码(指纹)
Python
中,设置字典的 键值对 时,会首先对 key
进行 hash
已决定如何在内存中保存字典的数据,以方便 后续 对字典的操作: 增、删、改、查key value提示:在其他的开发语言中,大多 不推荐使用全局变量 —— 可变范围太大,导致程序不好维护!
def demo1():
num = 10
print(num)
num = 20
print("修改后 %d" % num)
def demo2():
num = 100
print(num)
demo1()
demo2()
print("over")
# 定义一个全局变量
num = 10
def demo1():
print(num)
def demo2():
print(num)
demo1()
demo2()
print("over")
注意:函数执行时, 需要处理变量时 会:
全局变量的引用
提示:在其他的开发语言中,大多 不推荐使用全局变量 —— 可变范围太大,导致程序不好维护!
num = 10
def demo1():
print("demo1" + "-" * 50)
# 只是定义了一个局部变量,不会修改到全局变量,只是变量名相同而已
num = 100
print(num)
def demo2():
print("demo2" + "-" * 50)
print(num)
demo1()
demo2()
print("over")
注意:只是在函数内部定义了一个局部变量而已,只是变量名相同 —— 在函数内部不能直接修改全局变量的值
global
进行声明num = 10
def demo1():
print("demo1" + "-" * 50)
# global 关键字,告诉 Python 解释器 num 是一个全局变量
global num
# 只是定义了一个局部变量,不会修改到全局变量,只是变量名相同而已
num = 100
print(num)
def demo2():
print("demo2" + "-" * 50)
print(num)
demo1()
demo2()
print("over")
a = 10
def demo():
print("%d" % a)
print("%d" % b)
print("%d" % c)
b = 20
demo()
c = 30
g_
或者 gl_
的前缀提示:具体的要求格式,各公司要求可能会有些差异
函数根据 有没有参数 以及 有没有返回值 ,可以 相互组合 ,一共有 4 种 组合形式
定义函数时, 是否接收参数,或者是否返回结果 ,是根据 实际的功能需求 来决定的!
此类函数,不接收参数,也没有返回值,应用场景如下:
注意:
此类函数,不接收参数,但是有返回值,应用场景如下:
此类函数,接收参数,没有返回值,应用场景如下:
此类函数,接收参数,同时有返回值,应用场景如下:
return
关键字可以返回结果问题:一个函数执行后能否返回多个结果?
def measure():
"""返回当前的温度"""
print("开始测量...")
temp = 39
print("测量结束...")
return temp
result = measure()
print(result)
def measure():
"""返回当前的温度"""
print("开始测量...")
temp = 39
wetness = 10
print("测量结束...")
return (temp, wetness)
提示:如果一个函数返回的是元组,括号可以省略
Python
中,可以 将一个元组 使用 赋值语句 同时赋值给 多个变量result = temp, wetness = measure()
a = 6
, b = 100
# 解法 1 - 使用临时变量
c = b
b = a
a = c
# 解法 2 - 不使用临时变量
a = a + b
b = a - b
a = a - b
a, b = b, a
问题 1:在函数内部,针对参数使用 赋值语句 ,会不会影响调用函数时传递的 实参变量 ? —— 不会!
def demo(num, num_list):
print("函数内部")
# 赋值语句
num = 200
num_list = [1, 2, 3]
print(num)
print(num_list)
print("函数代码完成")
gl_num = 99
gl_list = [4, 5, 6]
demo(gl_num, gl_list)
print(gl_num)
print(gl_list)
问题 2:如果传递的参数是 可变类型 ,在函数内部,使用 方法 修改了数据的内容, 同样会影响到外部的数据
def mutable(num_list):
# num_list = [1, 2, 3]
num_list.extend([1, 2, 3])
print(num_list)
gl_list = [6, 7, 8]
mutable(gl_list)
print(gl_list)
+=
python
中,列表变量调用 +=
本质上是在执行列表变量的 extend
方法,不会修改变量的引用def demo(num, num_list):
print("函数内部代码")
# num = num + num
num += num
# num_list.extend(num_list) 由于是调用方法,所以不会修改变量的引用
# 函数执行结束后,外部数据同样会发生变化
num_list += num_list
print(num)
print(num_list)
print("函数代码完成")
gl_num = 9
gl_list = [1, 2, 3]
demo(gl_num, gl_list)
print(gl_num)
print(gl_list)
gl_num_list = [6, 3, 9]
# 默认就是升序排序,因为这种应用需求更多
gl_num_list.sort()
print(gl_num_list)
# 只有当需要降序排序时,才需要传递 `reverse` 参数
gl_num_list.sort(reverse=True)
print(gl_num_list)
def print_info(name, gender=True):
gender_text = "男生"
if not gender:
gender_text = "女生"
print("%s 是 %s" % (name, gender_text))
def print_info(name, gender=True, title):
def print_info(name, title="", gender=True):
"""
:param title: 职位
:param name: 班上同学的姓名
:param gender: True 男生 False 女生
"""
gender_text = "男生"
if not gender:
gender_text = "女生"
print("%s%s 是 %s" % (title, name, gender_text))
# 提示:在指定缺省参数的默认值时,应该使用最常见的值作为默认值!
print_info("小明")
print_info("老王", title="班长")
print_info("小美", gender=False)
python
中有 两种 多值参数:
*
可以接收 元组*
可以接收 字典*args
—— 存放 元组 参数,前面有一个 *
**kwargs
—— 存放 字典 参数,前面有两个 *
args
是 arguments
的缩写,有变量的含义kw
是 keyword
的缩写, kwargs
可以记忆 键值对参数def demo(num, *args, **kwargs):
print(num)
print(args)
print(kwargs)
demo(1, 2, 3, 4, 5, name="小明", age=18, gender=True)
提示: 多值参数 的应用会经常出现在网络上一些大牛开发的框架中,知道多值参数, 有利于我们能够读懂大牛的代码
sum_numbers
,可以接收的 任意多个整数def sum_numbers(*args):
num = 0
# 遍历 args 元组顺序求和
for n in args:
num += n
return num
print(sum_numbers(1, 2, 3))
args
kwargs
*
*
def demo(*args, **kwargs):
print(args)
print(kwargs)
# 需要将一个元组变量/字典变量传递给函数对应的参数
gl_nums = (1, 2, 3)
gl_xiaoming = {"name": "小明", "age": 18}
# 会把 num_tuple 和 xiaoming 作为元组传递个 args
# demo(gl_nums, gl_xiaoming)
demo(*gl_nums, **gl_xiaoming)
函数调用自身的 编程技巧 称为递归
示例代码
def sum_numbers(num):
print(num)
# 递归的出口很重要,否则会出现死循环
if num == 1:
return
sum_numbers(num - 1)
sum_numbers(3)
sum_numbers
num
def sum_numbers(num):
if num == 1:
return 1
# 假设 sum_numbers 能够完成 num - 1 的累加
temp = sum_numbers(num - 1)
# 函数内部的核心算法就是 两个数字的相加
return num + temp
print(sum_numbers(2))
提示:递归是一个 编程技巧 ,初次接触递归会感觉有些吃力!在处理 不确定的循环条件时 ,格外的有用,例如: 遍历整个文件目录的结构