Python初学者指南:万字详解

发表时间: 2020-09-27 13:41

认识 Python

人生苦短,我用 Python —— Life is short, you need Python

目标

私信小编01即可获取大量的Python学习资料

  • Python 的起源
  • 为什么要用 Python?
  • Python 的特点
  • Python 的优缺点

01. Python 的起源

Python 的创始人为吉多·范罗苏姆(Guido van Rossum)

  1. 1989 年的圣诞节期间,吉多·范罗苏姆为了在阿姆斯特丹打发时间,决心开发一个新的 解释程序 ,作为 ABC 语言的一种继承( 感觉下什么叫牛人
  2. ABC 是由吉多参加设计的一种教学语言,就吉多本人看来,ABC 这种语言非常优美和强大,是 专门为非专业程序员设计的 。但是 ABC 语言并没有成功,究其原因,吉多认为是 非开放造成的。吉多决心在 Python 中避免这一错误,并获取了非常好的效果
  3. 之所以选中 Python(蟒蛇) 作为程序的名字,是因为他是 BBC 电视剧——蒙提·派森的飞行马戏团(Monty Python's Flying Circus)的爱好者
  4. 1991 年,第一个 Python 解释器 诞生,它是用 C 语言实现的,并能够调用 C 语言的库文件

1.1 解释器(科普)

计算机不能直接理解任何除机器语言以外的语言,所以必须要把程序员所写的程序语言翻译成机器语言,计算机才能执行程序。 将其他语言翻译成机器语言的工具,被称为编译器

编译器翻译的方式有两种:一个是 编译 ,另外一个是 解释 。两种方式之间的区别在于 翻译时间点的不同 。当编译器 以解释方式运行的时候 ,也称之为 解释器

  • 编译型语言 :程序在执行之前需要一个专门的编译过程,把程序编译成为机器语言的文件,运行时不需要重新翻译,直接使用编译的结果就行了。程序执行效率高,依赖编译器,跨平台性差些。如 C、C++
  • 解释型语言 :解释型语言编写的程序不进行预先编译,以文本方式存储程序代码,会将代码一句一句直接运行。在发布程序时,看起来省了道编译工序,但是在运行程序的时候,必须先解释再运行

编译型语言和解释型语言对比

  • 速度 —— 编译型语言比解释型语言执行速度快
  • 跨平台性 —— 解释型语言比编译型语言跨平台性好

1.2 Python 的设计目标

1999 年,吉多·范罗苏姆向 DARPA 提交了一条名为 “Computer Programming for Everybody” 的资金申请,并在后来说明了他对 Python 的目标:

  • 一门 简单直观的语言 并与主要竞争者一样强大
  • 开源 ,以便任何人都可以为它做贡献
  • 代码 像纯英语那样容易理解
  • 适用于 短期 开发的日常任务

这些想法中的基本都已经成为现实,Python 已经成为一门流行的编程语言

1.3 Python 的设计哲学

  1. 优雅
  2. 明确
  3. 简单
  • Python 开发者的哲学是: 用一种方法,最好是只有一种方法来做一件事
  • 如果面临多种选择,Python 开发者一般会拒绝花俏的语法,而选择 明确没有或者很少有歧义的语法

在 Python 社区,吉多被称为“仁慈的独裁者”

02. 为什么选择 Python?

  • 代码量少
  • ……

同一样问题,用不同的语言解决,代码量差距还是很多的,一般情况下 Python 是 Java 的 1/5,所以说 人生苦短,我用 Python

03. Python 特点

  • Python 是 完全面向对象的语言函数模块数字字符串 都是对象, 在 Python 中一切皆对象完全支持继承、重载、多重继承支持重载运算符,也支持泛型设计
  • Python 拥有一个强大的标准库 ,Python 语言的核心只包含 数字字符串列表字典文件 等常见类型和函数,而由 Python 标准库提供了 系统管理网络通信文本处理数据库接口图形系统XML 处理 等额外的功能
  • Python 社区提供了 大量的第三方模块 ,使用方式与标准库类似。它们的功能覆盖 科学计算人工智能机器学习Web 开发数据库接口图形系统 多个领域

面向对象的思维方式

  • 面向对象 是一种 思维方式 ,也是一门 程序设计技术
  • 要解决一个问题前,首先考虑 由谁 来做,怎么做事情是 的职责,最后把事情做好就行!对象 就是
  • 要解决复杂的问题,就可以找 多个不同的对象各司其职 ,共同实现,最终完成需求

04. Python 的优缺点

4.1 优点

  • 简单、易学
  • 免费、开源
  • 面向对象
  • 丰富的库
  • 可扩展性如果需要一段关键代码运行得更快或者希望某些算法不公开,可以把这部分程序用 C 或C++ 编写,然后在 Python 程序中使用它们
  • ……

4.2 缺点

  • 运行速度
  • 国内市场较小
  • 中文资料匮乏

单行注释(行注释)

  • 以 # 开头, # 右边的所有东西都被当做说明文字,而不是真正要执行的程序,只起到辅助说明作用
  • 示例代码如下:
# 这是第一个单行注释print("hello python")

为了保证代码的可读性, # 后面建议先添加一个空格,然后再编写相应的说明文字

在代码后面增加的单行注释

  • 在程序开发时,同样可以使用 # 在代码的后面(旁边)增加说明性的文字
  • 但是,需要注意的是, 为了保证代码的可读性注释和代码之间 至少要有 两个空格
  • 示例代码如下:
print("hello python")  # 输出 `hello python`

多行注释(块注释)

  • 如果希望编写的 注释信息很多,一行无法显示 ,就可以使用多行注释
  • 要在 Python 程序中使用多行注释,可以用 一对 连续的 三个 引号 (单引号和双引号都可以)
  • 示例代码如下:
"""这是一个多行注释在多行注释之间,可以写很多很多的内容……""" print("hello python")

什么时候需要使用注释?

  1. 注释不是越多越好 ,对于一目了然的代码,不需要添加注释
  2. 对于 复杂的操作 ,应该在操作开始前写上若干行注释
  3. 对于 不是一目了然的代码 ,应在其行尾添加注释(为了提高可读性,注释应该至少离开代码 2 个空格)
  4. 绝不要描述代码,假设阅读代码的人比你更懂 Python,他只是不知道你的代码要做什么

在一些正规的开发团队,通常会有 代码审核 的惯例,就是一个团队中彼此阅读对方的代码

关于代码规范

  • Python 官方提供有一系列 PEP(Python Enhancement Proposals) 文档
  • 其中第 8 篇文档专门针对 Python 的代码格式 给出了建议,也就是俗称的 PEP 8
  • 文档地址: https://www.python.org/dev/peps/pep-0008/
  • 谷歌有对应的中文文档: http://zh-google-styleguide.readthedocs.io/en/latest/google-python-styleguide/python_style_rules/

任何语言的程序员,编写出符合规范的代码,是开始程序生涯的第一步

算数运算符

计算机,顾名思义就是负责进行 数学计算 并且 存储计算结果 的电子设备

目标

  • 算术运算符的基本使用

01. 算数运算符

  • 算数运算符是 运算符的一种
  • 是完成基本的算术运算使用的符号,用来处理四则运算

运算符描述实例+加10 + 20 = 30-减10 - 20 = -10*乘10 * 20 = 200/除10 / 20 = 0.5//取整除返回除法的整数部分(商) 9 // 2 输出结果 4%取余数返回除法的余数 9 % 2 = 1**幂又称次方、乘方,2 ** 3 = 8

  • 在 Python 中 * 运算符还可以用于字符串,计算结果就是字符串重复指定次数的结果
In [1]: "-" * 50Out[1]: '----------------------------------------'

02. 算数运算符的优先级

  • 和数学中的运算符的优先级一致,在 Python 中进行数学计算时,同样也是:先乘除后加减同级运算符是 从左至右 计算可以使用 () 调整计算的优先级
  • 以下表格的算数优先级由高到最低顺序排列

运算符描述**幂 (最高优先级)* / % //乘、除、取余数、取整除+ -加法、减法

  • 例如:2 + 3 * 5 = 17 (2 + 3) * 5 = 25 2 * 3 + 5 = 11 2 * (3 + 5) = 16

变量的基本使用

程序就是用来处理数据的,而变量就是用来存储数据的

目标

  • 变量定义
  • 变量的类型
  • 变量的命名

01. 变量定义

  • 在 Python 中,每个变量 在使用前都必须赋值 ,变量 赋值以后 该变量 才会被创建
  • 等号(=)用来给变量赋值= =
变量名 = 值

变量定义之后,后续就可以直接使用了

1) 变量演练1 —— iPython

# 定义 qq_number 的变量用来保存 qq 号码In [1]: qq_number = "1234567"# 输出 qq_number 中保存的内容In [2]: qq_numberOut[2]: '1234567'# 定义 qq_password 的变量用来保存 qq 密码In [3]: qq_password = "123"# 输出 qq_password 中保存的内容In [4]: qq_passwordOut[4]: '123'

使用交互式方式,如果要查看变量内容,直接输入变量名即可,不需要使用 print 函数

2) 变量演练 2 —— PyCharm

# 定义 qq 号码变量qq_number = "1234567"# 定义 qq 密码变量qq_password = "123"# 在程序中,如果要输出变量的内容,需要使用 print 函数print(qq_number)print(qq_password)

使用解释器执行,如果要输出变量的内容,必须要要使用 print 函数

3) 变量演练 3 —— 超市买苹果

  • 可以用 其他变量的计算结果 来定义变量
  • 变量定义之后,后续就可以直接使用了

需求

  • 苹果的价格是 8.5 元/斤
  • 买了 7.5 斤 苹果
  • 计算付款金额
# 定义苹果价格变量price = 8.5# 定义购买重量weight = 7.5# 计算金额money = price * weightprint(money)

思考题

  • 如果 只要买苹果,就返 5 块钱
  • 请重新计算购买金额
# 定义苹果价格变量price = 8.5# 定义购买重量weight = 7.5# 计算金额money = price * weight# 只要买苹果就返 5 元money = money - 5print(money)

提问

  • 上述代码中,一共定义有几个变量?三个: price / weight / money
  • money = money - 5 是在定义新的变量还是在使用变量?直接使用之前已经定义的变量变量名 只有在 第一次出现 才是 定义变量变量名 再次出现,不是定义变量,而是直接使用之前定义过的变量
  • 在程序开发中,可以修改之前定义变量中保存的值吗?可以变量中存储的值,就是可以

02. 变量的类型

  • 在内存中创建一个变量,会包括:变量的名称变量保存的数据变量存储数据的类型变量的地址(标示)

2.1 变量类型的演练 —— 个人信息

需求

  • 定义变量保存小明的个人信息
  • 姓名: 小明
  • 年龄: 18
  • 性别: 男生
  • 身高: 1.75
  • 体重: 75.0 公斤

利用 单步调试 确认变量中保存数据的类型

提问

  1. 在演练中,一共有几种数据类型?str bool int float
  2. 在 Python 中定义变量时需要指定类型吗?不需要Python 可以根据 = 等号右侧的值,自动推导出变量中存储数据的类型

2.2 变量的类型

  • 在 Python 中定义变量是 不需要指定类型 (在其他很多高级语言中都需要)
  • 数据类型可以分为 数字型非数字型
  • 数字型整型 ( int )浮点型( float )布尔型( bool )真 True 非 0 数 —— 非零即真假 False 0复数型 ( complex )主要用于科学计算,例如:平面场问题、波动问题、电感电容等问题
  • 非数字型字符串列表元组字典

提示:在 Python 2.x 中, 整数 根据保存数值的长度还分为:

intlong
  • 使用 type 函数可以查看一个变量的类型
In [1]: type(name)

2.3 不同类型变量之间的计算

1)数字型变量之间可以直接计算

  • 在 Python 中,两个数字型变量是可以直接进行 算数运算的
  • 如果变量是 bool 型,在计算时True 对应的数字是 1False 对应的数字是 0

演练步骤

i = 10f = 10.5b = True
  • 在 iPython 中,使用上述三个变量相互进行算术运算

2)字符串变量之间使用 + 拼接字符串

  • 在 Python 中,字符串之间可以使用 + 拼接生成新的字符串
In [1]: first_name = "三"In [2]: last_name = "张"In [3]: first_name + last_nameOut[3]: '三张'

3)字符串变量可以和整数使用 * 重复拼接相同的字符串

In [1]: "-" * 50Out[1]: '--------------------------------------------------'

4)数字型变量和字符串之间不能进行其他计算

In [1]: first_name = "zhang"In [2]: x = 10In [3]: x + first_name---------------------------------------------------------------------------TypeError: unsupported operand type(s) for +: 'int' and 'str'类型错误:`+` 不支持的操作类型:`int``str`

2.4 变量的输入

  • 所谓 输入 ,就是 用代码 获取 用户通过 键盘 输入的信息
  • 例如:去银行取钱,在 ATM 上输入密码
  • 在 Python 中,如果要获取用户在 键盘 上的输入信息,需要使用到 input 函数

1) 关于函数

  • 一个 提前准备好的功能 (别人或者自己写的代码), 可以直接使用 ,而 不用关心内部的细节
  • 目前已经学习过的函数

函数说明print(x)将 x 输出到控制台type(x)查看 x 的变量类型

2) input 函数实现键盘输入

  • 在 Python 中可以使用 input 函数从键盘等待用户的输入
  • 用户输入的 任何内容 Python 都认为是一个 字符串
  • 语法如下:
字符串变量 = input("提示信息:")

3) 类型转换函数

函数说明int(x)将 x 转换为一个整数float(x)将 x 转换到一个浮点数

4) 变量输入演练 —— 超市买苹果增强版

需求

  • 收银员输入 苹果的价格,单位: 元/斤
  • 收银员输入 用户购买苹果的重量,单位:
  • 计算并且 输出 付款金额

演练方式 1

# 1. 输入苹果单价price_str = input("请输入苹果价格:")# 2. 要求苹果重量weight_str = input("请输入苹果重量:")# 3. 计算金额# 1> 将苹果单价转换成小数price = float(price_str)# 2> 将苹果重量转换成小数weight = float(weight_str)# 3> 计算付款金额money = price * weightprint(money)

提问

  1. 演练中,针对 价格 定义了几个变量?两个price_str 记录用户输入的价格字符串price 记录转换后的价格数值
  2. 思考 —— 如果开发中,需要用户通过控制台 输入 很多个 数字 ,针对每一个数字都要定义两个变量, 方便吗

演练方式 2 —— 买苹果改进版

  1. 定义 一个 浮点变量 接收用户输入的同时,就使用 float 函数进行转换
price = float(input("请输入价格:"))
  • 改进后的好处:
  1. 节约空间,只需要为一个变量分配空间
  2. 起名字方便,不需要为中间变量起名字
  • 改进后的“缺点”:
  1. 初学者需要知道,两个函数能够嵌套使用,稍微有一些难度

提示

  • 如果输入的不是一个数字,程序执行时会出错,有关数据转换的高级话题,后续会讲!

2.5 变量的格式化输出

苹果单价 9.00 元/斤,购买了 5.00 斤,需要支付 45.00 元

  • 在 Python 中可以使用 print 函数将信息输出到控制台
  • 如果希望输出文字信息的同时, 一起输出 数据 ,就需要使用到 格式化操作符
  • % 被称为 格式化操作符 ,专门用于处理字符串中的格式包含 % 的字符串,被称为 格式化字符串% 和不同的 字符 连用, 不同类型的数据 需要使用 不同的格式化字符

格式化字符含义%s字符串%d有符号十进制整数, %06d 表示输出的整数显示位数,不足的地方使用 0 补全%f浮点数, %.2f 表示小数点后只显示两位%%输出 %

  • 语法格式如下:
print("格式化字符串" % 变量1)print("格式化字符串" % (变量1, 变量2...))

格式化输出演练 —— 基本练习

需求

  1. 定义字符串变量 name ,输出 我的名字叫 小明,请多多关照!
  2. 定义整数变量 student_no ,输出 我的学号是 000001
  3. 定义小数 price 、 weight 、 money ,输出 苹果单价 9.00 元/斤,购买了 5.00 斤,需要支付 45.00 元
  4. 定义一个小数 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)

变量的命名

目标

  • 标识符和关键字
  • 变量的命名规则

0.1 标识符和关键字

1.1 标识符

标示符就是程序员定义的 变量名函数名

名字需要有 见名知义 的效果,见下图:

  • 标示符可以由 字母下划线数字 组成
  • 不能以数字开头
  • 不能与关键字重名

思考:下面的标示符哪些是正确的,哪些不正确为什么?

fromNo12from#12my_Booleanmy-BooleanObj22ndObjmyIntMy_tExt_testtest!32haha(da)ttjack_rosejack&roseGUIG.U.I

1.2 关键字

  • 关键字 就是在 Python 内部已经使用的标识符
  • 关键字 具有特殊的功能和含义
  • 开发者 不允许定义和关键字相同的名字的标示符

通过以下命令可以查看 Python 中的关键字

In [1]: import keywordIn [2]: print(keyword.kwlist)

提示: 关键字的学习及使用 ,会在后面的课程中不断介绍

  • import 关键字 可以导入一个 “工具包”
  • 在 Python 中不同的工具包,提供有不同的工具

02. 变量的命名规则

命名规则可以被视为一种 惯例 ,并无绝对与强制

目的是为了 增加代码的识别和可读性

注意 Python 中的 标识符区分大小写的

  1. 在定义变量时,为了保证代码格式, = 的左右应该各保留一个空格
  2. 在 Python 中,如果 变量名 需要由 二个多个单词 组成时,可以按照以下方式命名每个单词都使用小写字母单词与单词之间使用 _ 下划线 连接例如: first_name 、 last_name 、 qq_number 、 qq_password

驼峰命名法

  • 变量名 是由二个或多个单词组成时,还可以利用驼峰命名法来命名
  • 小驼峰式命名法第一个单词以小写字母开始,后续单词的首字母大写例如: firstName 、 lastName
  • 大驼峰式命名法每一个单词的首字母都采用大写字母例如: FirstName 、 LastName 、 CamelCase

判断(if)语句

目标

  • 开发中的应用场景
  • if 语句体验
  • if 语句进阶
  • 综合应用

01. 开发中的应用场景

生活中的判断几乎是无所不在的,我们每天都在做各种各样的选择,如果这样?如果那样?……

程序中的判断

if 今天发工资:    先还信用卡的钱    if 有剩余:        又可以happy了,O(∩_∩)O哈哈~    else:        噢,no。。。还的等30天else:    盼着发工资

判断的定义

  • 如果 条件满足 ,才能做某件事情,
  • 如果 条件不满足 ,就做另外一件事情,或者什么也不做

正是因为有了判断,才使得程序世界丰富多彩,充满变化!

判断语句又被称为 “分支语句”,正是因为有了判断,才让程序有了很多的分支

02. if 语句体验

2.1 if 判断语句基本语法

在 Python 中, if 语句 就是用来进行判断的,格式如下:

if 要判断的条件:    条件成立时,要做的事情    ……

注意:代码的缩进为一个 tab 键,或者 4 个空格 —— 建议使用空格

  • 在 Python 开发中,Tab 和空格不要混用!

我们可以把整个 if 语句看成一个完整的代码块

2.2 判断语句演练 —— 判断年龄

需求

  1. 定义一个整数变量记录年龄
  2. 判断是否满 18 岁 ( >=
  3. 如果满 18 岁,允许进网吧嗨皮
# 1. 定义年龄变量age = 18# 2. 判断是否满 18 岁# if 语句以及缩进部分的代码是一个完整的代码块if age >= 18:    print("可以进网吧嗨皮……")# 3. 思考!- 无论条件是否满足都会执行print("这句代码什么时候执行?")

注意:

  • if 语句以及缩进部分是一个 完整的代码块

2.3 else 处理条件不满足的情况

思考

在使用 if 判断时,只能做到满足条件时要做的事情。那如果需要在 不满足条件的时候 ,做某些事情,该如何做呢?

答案

else ,格式如下:

if 要判断的条件:    条件成立时,要做的事情    ……else:    条件不成立时,要做的事情    ……

注意:

  • if 和 else 语句以及各自的缩进部分共同是一个 完整的代码块

2.4 判断语句演练 —— 判断年龄改进

需求

  1. 输入用户年龄
  2. 判断是否满 18 岁 ( >=
  3. 如果满 18 岁,允许进网吧嗨皮
  4. 如果未满 18 岁,提示回家写作业
# 1. 输入用户年龄age = int(input("今年多大了?"))# 2. 判断是否满 18 岁# if 语句以及缩进部分的代码是一个完整的语法块if age >= 18:    print("可以进网吧嗨皮……")else:    print("你还没长大,应该回家写作业!")# 3. 思考!- 无论条件是否满足都会执行print("这句代码什么时候执行?")

03. 逻辑运算

  • 在程序开发中,通常 在判断条件时 ,会需要同时判断多个条件
  • 只有多个条件都满足,才能够执行后续代码,这个时候需要使用到 逻辑运算符
  • 逻辑运算符 可以把 多个条件 按照 逻辑 进行 连接 ,变成 更复杂的条件
  • Python 中的 逻辑运算符 包括: 与 and或 or非 not 三种

3.1 and

条件1 and 条件2
  • 并且
  • 两个条件同时满足,返回 True
  • 只要有一个不满足,就返回 False

条件 1条件 2结果成立成立成立成立不成立不成立不成立成立不成立不成立不成立不成立

3.2 or

条件1 or 条件2
  • 或者
  • 两个条件只要有一个满足,返回 True
  • 两个条件都不满足,返回 False

条件 1条件 2结果成立成立成立成立不成立成立不成立成立成立不成立不成立不成立

3.3 not

not 条件
  • 不是

条件结果成立不成立不成立成立

逻辑运算演练

  1. 练习1: 定义一个整数变量 age ,编写代码判断年龄是否正确要求人的年龄在 0-120 之间
  2. 练习2: 定义两个整数变量 python_score 、 c_score ,编写代码判断成绩要求只要有一门成绩 > 60 分就算合格
  3. 练习3: 定义一个布尔型变量 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 = 50c_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("非公勿内")

04. if 语句进阶

4.1 elif

  • 在开发中,使用 if 可以 判断条件
  • 使用 else 可以处理 条件不成立 的情况
  • 但是,如果希望 再增加一些条件条件不同,需要执行的代码也不同 时,就可以使用 elif
  • 语法格式如下:
if 条件1:    条件1满足执行的代码    ……elif 条件2:    条件2满足时,执行的代码    ……elif 条件3:    条件3满足时,执行的代码    ……else:    以上条件都不满足时,执行的代码    ……
  • 对比逻辑运算符的代码
if 条件1 and 条件2:    条件1满足 并且 条件2满足 执行的代码    ……

注意

  1. elif 和 else 都必须和 if 联合使用,而不能单独使用
  2. 可以将 if 、 elif 和 else 以及各自缩进的代码,看成一个 完整的代码块

elif 演练 —— 女友的节日

需求

  1. 定义 holiday_name 字符串变量记录节日名称
  2. 如果是 情人节 应该 买玫瑰看电影
  3. 如果是 平安夜 应该 买苹果吃大餐
  4. 如果是 生日 应该 买蛋糕
  5. 其他的日子每天都是节日啊……
holiday_name = "平安夜"if holiday_name == "情人节":    print("买玫瑰")    print("看电影")elif holiday_name == "平安夜":    print("买苹果")    print("吃大餐")elif holiday_name == "生日":    print("买蛋糕")else:    print("每天都是节日啊……")

4.2 if 的嵌套

elif的应用场景是: 同时 判断 多个条件 ,所有的条件是 平级

  • 在开发中,使用 if 进行条件判断,如果希望 在条件成立的执行语句中增加条件判断 ,就可以使用 if 的嵌套
  • if 的嵌套 的应用场景就是: 在之前条件满足的前提下,再增加额外的判断
  • if 的嵌套 的语法格式, 除了缩进之外 和之前的没有区别
  • 语法格式如下:
if 条件 1:    条件 1 满足执行的代码    ……        if 条件 1 基础上的条件 2:        条件 2 满足时,执行的代码        ……                # 条件 2 不满足的处理    else:        条件 2 不满足时,执行的代码        # 条件 1 不满足的处理else:    条件1 不满足时,执行的代码    ……

if 的嵌套 演练 —— 火车站安检

需求

  1. 定义布尔型变量 has_ticket 表示是否有车票
  2. 定义整型变量 knife_length 表示刀的长度,单位:厘米
  3. 首先检查是否有车票,如果有,才允许进行 安检
  4. 安检时,需要检查刀的长度,判断是否超过 20 厘米如果超过 20 厘米,提示刀的长度,不允许上车如果不超过 20 厘米,安检通过
  5. 如果没有车票,不允许进门
# 定义布尔型变量 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("大哥,您要先买票啊")

05. 综合应用 —— 石头剪刀布

目标

  1. 强化 多个条件逻辑运算
  2. 体会 import 导入模块(“工具包”)的使用

需求

  1. 从控制台输入要出的拳 —— 石头(1)/剪刀(2)/布(3)
  2. 电脑 随机 出拳 —— 先假定电脑只会出石头,完成整体代码功能
  3. 比较胜负

序号规则1石头 胜 剪刀2剪刀 胜 布3布 胜 石头

5.1 基础代码实现

  • 假定电脑就只会出石头 ,完成整体代码功能
# 从控制台输入要出的拳 —— 石头(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("不行,我要和你决战到天亮!")

5.2 随机数的处理

  • 在 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/数学符号表

01. 算数运算符

  • 是完成基本的算术运算使用的符号,用来处理四则运算

运算符描述实例+加10 + 20 = 30-减10 - 20 = -10*乘10 * 20 = 200/除10 / 20 = 0.5//取整除返回除法的整数部分(商) 9 // 2 输出结果 4%取余数返回除法的余数 9 % 2 = 1**幂又称次方、乘方,2 ** 3 = 8

  • 在 Python 中 * 运算符还可以用于字符串,计算结果就是字符串重复指定次数的结果
In [1]: "-" * 50Out[1]: '----------------------------------------'

02. 比较(关系)运算符

运算符描述==检查两个操作数的值是否 相等 ,如果是,则条件成立,返回 True!=检查两个操作数的值是否 不相等 ,如果是,则条件成立,返回 True>检查左操作数的值是否 大于 右操作数的值,如果是,则条件成立,返回 True<检查左操作数的值是否 小于 右操作数的值,如果是,则条件成立,返回 True>=检查左操作数的值是否 大于或等于 右操作数的值,如果是,则条件成立,返回 True<=检查左操作数的值是否 小于或等于 右操作数的值,如果是,则条件成立,返回 True

Python 2.x 中判断 不等于 还可以使用 <> 运算符

!= 在 Python 2.x 中同样可以用来判断 不等于

03. 逻辑运算符

运算符逻辑表达式描述andx and y只有 x 和 y 的值都为 True,才会返回 True
否则只要 x 或者 y 有一个值为 False,就返回 Falseorx or y只要 x 或者 y 有一个值为 True,就返回 True
只有 x 和 y 的值都为 False,才会返回 Falsenotnot x如果 x 为 True,返回 False
如果 x 为 False,返回 True

04. 赋值运算符

  • 在 Python 中,使用 = 可以给变量赋值
  • 在算术运算时,为了简化代码的编写, Python 还提供了一系列的 与 算术运算符 对应的 赋值运算符
  • 注意: 赋值运算符中间不能使用空格

运算符描述实例=简单的赋值运算符c = a + b 将 a + b 的运算结果赋值为 c+=加法赋值运算符c += a 等效于 c = c + a-=减法赋值运算符c -= a 等效于 c = c - a*=乘法赋值运算符c *= a 等效于 c = c * a/=除法赋值运算符c /= a 等效于 c = c / a//=取整除赋值运算符c //= a 等效于 c = c // a%=取 (余数)赋值运算符c %= a 等效于 c = c % a**=幂赋值运算符c **= a 等效于 c = c ** a

05. 运算符的优先级

  • 以下表格的算数优先级由高到最低顺序排列

运算符描述**幂 (最高优先级)* / % //乘、除、取余数、取整除+ -加法、减法<= < > >=比较运算符== !=等于运算符= %= /= //= -= += *= **=赋值运算符not or and逻辑运算符

循环

目标

  • 程序的三大流程
  • while 循环基本使用
  • break 和 continue
  • while 循环嵌套

01. 程序的三大流程

  • 在程序开发中,一共有三种流程方式:顺序 —— 从上向下 ,顺序执行代码分支 —— 根据条件判断,决定执行代码的 分支循环 —— 让 特定代码 重复 执行

02. while 循环基本使用

  • 循环的作用就是让 指定的代码 重复的执行
  • while 循环最常用的应用场景就是 让执行的代码 按照 指定的次数 重复 执行
  • 需求 —— 打印 5 遍 Hello Python
  • 思考 —— 如果要求打印 100 遍怎么办?

2.1 while 语句基本语法

初始条件设置 —— 通常是重复执行的 计数器while 条件(判断 计数器 是否达到 目标次数):    条件满足时,做的事情1    条件满足时,做的事情2    条件满足时,做的事情3    ...(省略)...        处理条件(计数器 + 1)

注意:

  • while 语句以及缩进部分是一个 完整的代码块

第一个 while 循环

需求

  • 打印 5 遍 Hello Python
while# 1. 定义重复次数计数器i = 1# 2. 使用 while 判断条件while i <= 5:    # 要重复执行的代码    print("Hello Python")    # 处理计数器 i    i = i + 1print("循环结束后的 i = %d" % i)

注意:循环结束后,之前定义的计数器条件的数值是依旧存在的

死循环

由于程序员的原因, 忘记 在循环内部 修改循环的判断条件 ,导致循环持续执行,程序无法终止!

2.2 赋值运算符

  • 在 Python 中,使用 = 可以给变量赋值
  • 在算术运算时,为了简化代码的编写, Python 还提供了一系列的 与 算术运算符 对应的 赋值运算符
  • 注意: 赋值运算符中间不能使用空格

运算符描述实例=简单的赋值运算符c = a + b 将 a + b 的运算结果赋值为 c+=加法赋值运算符c += a 等效于 c = c + a-=减法赋值运算符c -= a 等效于 c = c - a*=乘法赋值运算符c *= a 等效于 c = c * a/=除法赋值运算符c /= a 等效于 c = c / a//=取整除赋值运算符c //= a 等效于 c = c // a%=取 (余数)赋值运算符c %= a 等效于 c = c % a**=幂赋值运算符c **= a 等效于 c = c ** a

2.3 Python 中的计数方法

常见的计数方法有两种,可以分别称为:

  • 自然计数法 (从 1 开始)—— 更符合人类的习惯
  • 程序计数法 (从 0 开始)—— 几乎所有的程序语言都选择从 0 开始计数

因此,大家在编写程序时,应该尽量养成习惯: 除非需求的特殊要求,否则 循环 的计数都从 0 开始

2.4 循环计算

在程序开发中,通常会遇到 利用循环 重复计算 的需求

遇到这种需求,可以:

  1. 在 while 上方定义一个变量,用于 存放最终计算结果
  2. 在循环体内部,每次循环都用 最新的计算结果更新 之前定义的变量

需求

  • 计算 0 ~ 100 之间所有数字的累计求和结果
# 计算 0 ~ 100 之间所有数字的累计求和结果# 0. 定义最终结果的变量result = 0# 1. 定义一个整数的变量记录循环的次数i = 0# 2. 开始循环while i <= 100:    print(i)    # 每一次循环,都让 result 这个变量和 i 这个计数器相加    result += i    # 处理计数器    i += 1print("0~100之间的数字求和结果 = %d" % result)

需求进阶

  • 计算 0 ~ 100 之间 所有 偶数 的累计求和结果

开发步骤

  1. 编写循环 确认 要计算的数字
  2. 添加 结果 变量,在循环内部 处理计算结果
# 0. 最终结果result = 0# 1. 计数器i = 0# 2. 开始循环while i <= 100:    # 判断偶数    if i % 2 == 0:        print(i)        result += i    # 处理计数器    i += 1print("0~100之间偶数求和结果 = %d" % result)

03. break 和 continue

break 和 continue 是专门在循环中使用的关键字

  • break 某一条件满足时 ,退出循环,不再执行后续重复的代码
  • continue 某一条件满足时 ,不执行后续重复的代码

break 和 continue 只针对 当前所在循环 有效

3.1 break

  • 在循环过程中 ,如果 某一个条件满足后 再希望 循环继续执行 ,可以使用 break 退出循环
i = 0while i < 10:    # break 某一条件满足时,退出循环,不再执行后续重复的代码    # i == 3    if i == 3:        break    print(i)    i += 1print("over")

break 只针对当前所在循环有效

3.2 continue

  • 在循环过程中 ,如果 某一个条件满足后 希望 执行循环代码,但是又不希望退出循环 ,可以使用 continue
  • 也就是:在整个循环中, 只有某些条件 ,不需要执行循环代码,而其他条件都需要执行
i = 0while i < 10:    # 当 i == 7 时,不希望执行需要重复执行的代码    if i == 7:        # 在使用 continue 之前,同样应该修改计数器        # 否则会出现死循环        i += 1        continue    # 重复执行的代码    print(i)    i += 1
  • 需要注意:使用 continue 时, 条件处理部分的代码,需要特别注意 ,不小心会出现 死循环

continue 只针对当前所在循环有效

04. while 循环嵌套

4.1 循环嵌套

  • while 嵌套就是: while 里面还有 while
while 条件 1:    条件满足时,做的事情1    条件满足时,做的事情2    条件满足时,做的事情3    ...(省略)...        while 条件 2:        条件满足时,做的事情1        条件满足时,做的事情2        条件满足时,做的事情3        ...(省略)...            处理条件 2        处理条件 1

4.2 循环嵌套演练 —— 九九乘法表

第 1 步:用嵌套打印小星星

需求

  • 在控制台连续输出五行 * ,每一行星号的数量依次递增
***************
  • 使用字符串 * 打印
# 1. 定义一个计数器变量,从数字1开始,循环会比较方便row = 1while row <= 5:    print("*" * row)    row += 1

第 2 步:使用循环嵌套打印小星星

知识点对 print 函数的使用做一个增强

  • 在默认情况下, print 函数输出内容之后,会自动在内容末尾增加换行
  • 如果不希望末尾增加换行,可以在 print 函数输出内容的后面增加 , end=""
  • 其中 "" 中间可以指定 print 函数输出内容之后,继续希望显示的内容
  • 语法格式如下:
# 向控制台输出内容结束之后,不会换行print("*", end="")# 单纯的换行print("")

end="" 表示向控制台输出内容结束之后,不会换行

假设 Python 没有提供 字符串的 * 操作 拼接字符串

需求

  • 在控制台连续输出五行 * ,每一行星号的数量依次递增
***************

开发步骤

  • 1> 完成 5 行内容的简单输出
  • 2> 分析每行内部的 * 应该如何处理?列
row = 1while row <= 5:    # 假设 python 没有提供字符串 * 操作    # 在循环内部,再增加一个循环,实现每一行的 星星 打印    col = 1    while col <= row:        print("*", end="")        col += 1    # 每一行星号输出完成后,再增加一个换行    print("")    row += 1

第 3 步: 九九乘法表

需求输出 九九乘法表,格式如下:

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

开发步骤

  • 打印 9 行小星星
*********************************************
  • 将每一个 * 替换成对应的行与列相乘
# 定义起始行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 在控制台输出一个 换行符

制表符的功能是在不使用表格的情况下在 垂直方向 按列对齐文本

转义字符描述\反斜杠符号\'单引号\"双引号\n换行\t横向制表符\r回车

函数基础

目标

  • 函数的快速体验
  • 函数的基本使用
  • 函数的参数
  • 函数的返回值
  • 函数的嵌套调用
  • 在模块中定义函数

01. 函数的快速体验

1.1 快速体验

  • 所谓 函数 ,就是把 具有独立功能的代码块 组织为一个小模块,在需要的时候 调用
  • 函数的使用包含两个步骤:定义函数 —— 封装 独立的功能调用函数 —— 享受 封装 的成果
  • 函数的作用 ,在开发程序时,使用函数可以提高编写的效率以及代码的 重用

演练步骤

  1. 新建 04_函数 项目
  2. 复制之前完成的 乘法表 文件
  3. 修改文件,增加函数定义 multiple_table():
  4. 新建另外一个文件,使用 import 导入并且调用函数

02. 函数基本使用

2.1 函数的定义

定义函数的格式如下:

def 函数名():    函数封装的代码    ……
  1. def 是英文 define 的缩写
  2. 函数名称 应该能够表达 函数封装代码 的功能,方便后续的调用
  3. 函数名称 的命名应该 符合 标识符的命名规则可以由 字母下划线数字 组成不能以数字开头不能与关键字重名

2.2 函数调用

调用函数很简单的,通过 函数名() 即可完成对函数的调用

2.3 第一个函数演练

需求

  • 编写一个打招呼 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 这个名字没有被定义 )

2.4 PyCharm 的调试工具

  • F8 Step Over 可以单步执行代码,会把函数调用看作是一行代码直接执行
  • F7 Step Into 可以单步执行代码,如果是函数,会进入函数内部

2.5 函数的文档注释

  • 在开发中,如果希望给函数添加注释,应该在 定义函数 的下方,使用 连续的三对引号
  • 连续的三对引号 之间编写对函数的说明文字
  • 函数调用 位置,使用快捷键 CTRL + Q 可以查看函数的说明信息

注意:因为 函数体相对比较独立函数定义的上方 ,应该和其他代码(包括注释)保留 两个空行

03. 函数的参数

演练需求

  1. 开发一个 sum_2_num 的函数
  2. 函数能够实现 两个数字的求和 功能

演练代码如下:

def sum_2_num():    num1 = 10    num2 = 20    result = num1 + num2    print("%d + %d = %d" % (num1, num2, result))sum_2_num()

思考一下存在什么问题

函数只能处理 固定数值 的相加

如何解决?

  • 如果能够把需要计算的数字,在调用函数时,传递到函数内部就好了!

3.1 函数参数的使用

  • 在函数名的后面的小括号内部填写 参数
  • 多个参数之间使用 , 分隔
def sum_2_num(num1, num2):    result = num1 + num2        print("%d + %d = %d" % (num1, num2, result))sum_2_num(50, 20)

3.2 参数的作用

  • 函数 ,把 具有独立功能的代码块 组织为一个小模块,在需要的时候 调用
  • 函数的参数 ,增加函数的 通用性 ,针对 相同的数据处理逻辑 ,能够 适应更多的数据在函数 内部 ,把参数当做 变量 使用,进行需要的数据处理函数调用时,按照函数定义的 参数顺序 ,把 希望在函数内部处理的数据通过参数 传递

3.3 形参和实参

  • 形参定义 函数时,小括号中的参数,是用来接收参数用的,在函数内部 作为变量使用
  • 实参调用 函数时,小括号中的参数,是用来把数据传递到 函数内部 用的

04. 函数的返回值

  • 在程序开发中,有时候,会希望 一个函数执行结束后,告诉调用者一个结果 ,以便调用者针对具体的结果做后续的处理
  • 返回值 是函数 完成工作 后, 最后 给调用者的 一个结果
  • 在函数中使用 return 关键字可以返回结果
  • 调用函数一方,可以 使用变量接收 函数的返回结果

注意: return 表示返回,后续的代码都不会被执行

def sum_2_num(num1, num2):    """对两个数字的求和"""    return num1 + num2# 调用函数,并使用 result 变量接收计算结果result = sum_2_num(10, 20)print("计算结果是 %d" % result)

05. 函数的嵌套调用

  • 一个函数里面 又调用另外一个函数 ,这就是 函数嵌套调用
  • 如果函数 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()

函数嵌套的演练 —— 打印分隔线

体会一下工作中 需求是多变

需求 1

  • 定义一个 print_line 函数能够打印 * 组成的 一条分隔线
def print_line(char):    print("*" * 50)

需求 2

  • 定义一个函数能够打印 由任意字符组成 的分隔线
def print_line(char):    print(char * 50)

需求 3

  • 定义一个函数能够打印 任意重复次数 的分隔线
def print_line(char, times):    print(char * times)

需求 4

  • 定义一个函数能够打印 5 行 的分隔线,分隔线要求符合 需求 3

提示:工作中针对需求的变化,应该冷静思考, 不要轻易修改之前已经完成的,能够正常执行的函数

def print_line(char, times):    print(char * times)def print_lines(char, times):    row = 0        while row < 5:        print_line(char, times)        row += 1

06. 使用模块中的函数

模块是 Python 程序架构的一个核心概念

  • 模块 就好比是 工具包 ,要想使用这个工具包中的工具,就需要 导入 import 这个模块
  • 每一个以扩展名 py 结尾的 Python 源代码文件都是一个 模块
  • 在模块中定义的 全局变量函数 都是模块能够提供给外界直接使用的工具

6.1 第一个模块体验

步骤

  • 新建 hm_10_分隔线模块.py复制 hm_09_打印多条分隔线.py 中的内容, 最后一行 print 代码除外增加一个字符串变量
name = "黑马程序员"
  • 新建 hm_10_体验模块.py 文件,并且编写以下代码:
import hm_10_分隔线模块hm_10_分隔线模块.print_line("-", 80)print(hm_10_分隔线模块.name)

体验小结

  • 可以 在一个 Python 文件定义 变量 或者 函数
  • 然后在 另外一个文件中 使用 import 导入这个模块
  • 导入之后,就可以使用 模块名.变量 / 模块名.函数 的方式,使用这个模块中定义的变量或者函数

模块可以让 曾经编写过的代码 方便的被 复用

6.2 模块名也是一个标识符

  • 标示符可以由 字母下划线数字 组成
  • 不能以数字开头
  • 不能与关键字重名

注意:如果在给 Python 文件起名时, 以数字开头 是无法在 PyCharm 中通过导入这个模块的

6.3 Pyc 文件(了解)

C 是 compiled 编译过 的意思

操作步骤

  1. 浏览程序目录会发现一个 __pycache__ 的目录
  2. 目录下会有一个 hm_10_分隔线模块.cpython-35.pyc 文件, cpython-35 表示 Python 解释器