python6

v>

软件测试
广州博才科技开发有限公司
迅捷PDF编辑器
# 在函数内部定义局部变量 my_val
def my_function2():
my_val = 100
# 尝试输出 my_function2 函数中定义的局部变量
def my_function3():
print(my_val)
# 函数调用
my_function1()
my_function2()
my_function3()
如果局部变量和全局变量命名冲突, Python 解释器会怎么做?
total_value = 100
def my_function():
total_value = 200
print('total_value:', total_value)
my_function()
请问: 上面的代码输入结果是什么?
Python 解释器会在函数内部搜索变量 total_value, 如果找到了就直接使用, 如果找不到则到全局范围内搜索.
2.5.2.4 函数的缺省参数(默认参数)
默认参数指的是当函数调用中省略了实参时默认使用的值.
默认参数的语法与使用:
1. 在函数声明或定义时, 直接对参数赋值. 这就是设置形参的默认参数.
2. 在函数调用时, 省略部分或全部的参数. 这时可以用默认参数来代替.
def my_function(a, b=20, c=30):
return a+b+c
my_function(10)
my_function(10, 100)
my_function(10, 100, 1000)
注意: 带有默认值的参数一定要位于参数列表的最后面.
2.5.3 函数文档及作用
函数也需要添加注释, 方便函数功能、参数以及返回值的含义能够被调用者知悉. 但普通的单行多行注释, 需
要查看函数定义时才能看到, 有没有一种方式能够在调用时快捷查看函数相关信息?
DocString 是一个重要的工具, 由于它帮助你的程序文档更加简单易懂.
37软件测试
广州博才科技开发有限公司
迅捷PDF编辑器
# 单行函数文档字符串
def my_function(param):
"""函数做了什么事, 返回什么结果."""
return param + 10
# 多行函数文档字符串
def my_add(num1, num2):
"""计算两个整数的和.
:param int num1: 加法运算的左操作数
:param int num2: 加法运算的右操作数
:return 返回两个操作数相加的结果
"""
result = num1 + num2
return result
我们可以通过 ctrl + q 快捷键可以查看函数信息, 也可以通过 help() 函数来查看函数信息.
2.5.4 单一职责原则
请问: 在工作中一个人负责的职责越多还是越好? 同理问, 编写一个函数, 函数能完成的功能越多还是越好?
单一职责原则说的是一个函数只负责一个事情.这是因为, 如果一个函数承担的职责过多, 就等于把这些职责混合在
一起, 一个职责的变化可能会影响其它职责的能力.
1.简称 单一职责原则的英文名称是Single Responsibility Principle, 简称RSP.
2.定义 就一个函数而言, 应该仅有一个引起它变化的原因, 简单的说, 一个函数中应该是一组相关性很高的的封装.
即一个类只负责一项职责, 而不应该同时负责多个职责.
3.问题 比如 C 函数负责两个不同的职责 D1 和 D2. D1 功能需求发生变化时, 更改 C 函数, 有可能使原本正常运行
的 D2 发生错误, 代码耦合性太高, 较复杂.
4.解决 把功能独立出来, 让它们满足单一职责原则. 比如创建两个函数 C1 和 C2, C1 完成功能 D1, C2 完成功能
D2. 任何一个功能出现问题都不会造成另一个功能出问题.
2.5.5 小结
1. 函数是实现代码复用的一种技术, 可以减少代码冗余.
2. 函数定义不会执行代码, 函数调用会执行代码.
3. 函数使用 def 来定义, 函数调用时候使用 "函数名(参数...)".
4. 函数调用时, 如果位置参数和关键字参数并存, 位置参数必须在关键字参数前面.
5. 函数的参数叫做形参, 调用函数时传递的数值叫做实参.
6. 函数内部定义的变量叫做局部变量, 函数外部定义的变量叫做全局变量. 6.1 局部变量只能在函数内部使用, 函
数外无法使用. 6.2 全局变量可以在当前 python 文件定义的所有函数中访问. 6.3 全局范围指的是整个 Python
文件范围.
7. 函数文档的作用解释说明函数, 并可以通过 ctrl + q 或者 help() 函数快速查阅.
8. 函数的编写要遵循的单一职责原则, 即一个函数只负责一个事情.
9. return 用于将函数的计算结果返回给函数的调用者, 使用时需要注意以下几点: 9.1 只要函数执行碰到 return 就
会停止执行. 9.2 函数中可以编写多个 return, 但有且只有一个 return 会执行. 9.3 return 后面可以跟上要返回的
值, 也单独使用相当于 return None. 9.4 break 用在循环中, 用来终止循环执行. return 用在函数中, 用来终止函
38软件测试
广州博才科技开发有限公司
迅捷PDF编辑器
数执行.
2.5.6 思考
1. 一个函数是否可以没有参数, 如果可以, 为什么? 如果不可以, 为什么?
2. 一个函数是否可以没有返回值, 如果可以, 为什么? 如果不可以, 为什么?
39软件测试
广州博才科技开发有限公司
迅捷PDF编辑器
3 容器
学习目标:
1. 能够说出容器类型有什么用
2. 能够说出常用 Python 容器的名字
3. 能够说出切片语法的用途
4. 能够说出容器中的索引指的是什么
5. 能够说出如何定义一个字符串
6. 能够说出字符串容器的特性
7. 能够说出至少5个字符串方法名字和作用
8. 能够使用切片语法获得指定索引区间的子串
9. 能够说出如何使用 while 和 for 循环来遍历字符串
10. 能够说出如何定义一个列表
11. 能够说出列表容器和字符串容器的区别
12. 能够说出至少5个列表方法名字和作用
13. 能够使用切片语法获得列表指定索引区间的元素
14. 能够说出如何使用 while 和 for 循环来遍历列表中的元素
15. 能够说出如何定义一个列表
16. 能够说出元组和列表的区别
17. 能够说出如何使用 while 和 for 循环来遍历元组中的元素
18. 能够说出元组支持哪些操作
19. 能够说出如何定义一个字典
20. 能够说出字典和列表的区别
21. 能够说出如何使用 for 循环来遍历列表中的键、值和键值对
22. 能够说出字典键和值的特点
为什么要学习容器类型? 容器类型有什么用?
答: 之前学习的变量类型都只能存储单一元素, 如果我要存储全班100个学生的成绩, 需要定义100个变量. 将所有的
元素放在同一个容器中, 一个容器变量就可以存储多个元素. 减少了变量的定义.
为什么容器类型提供了多个类型?
答: 每种容器针对了不同的使用场景, 有的容器方便操作、有的容器查询效率比较高、有的元素可以保证元素唯一、
有的元素可以保证数据只读等等. 学校就是一个容器, 学校有多种, 有学习动漫的、有学习IT编程的、有学习英语的
等等, 虽然都是学校但是所做的事情不同.
容器分类?
为了便于学习, 我们根据不同容器的特性, 将常用容器分为序列式容器和非序列式容器.
1. 序列式容器中的元素在存放时都是连续存放的, 也就是序列式容器中, 除了第一个元素的前面没有元素, 最后一
个元素的后面没有元素, 其他所有的元素前后都有一个元素. 包括字符串、列表、元组.
40软件测试
广州博才科技开发有限公司
迅捷PDF编辑器
2. 非序列式容器在存储元素时不是连续存放的, 容器中的任何一个元素前后都可能没有元素. 包括字典、集合.
序列式容器支持根据索引(下标)访问元素, 而非序列式容器不支持索引(下标)的方式访问元素.
序列式容器支持切片操作, 而非序列式容器不支持切片操作.
什么是索引?
在序列式容器中, 会给每一个元素赋予一个编号, 该编号从 0 开始计算. 第一个元素的索引就为 0, 第二个元素的索引
就为 1, 以此类推, 支持索引的容器可以使用 0 1 ... 来获得某个位置的元素.
什么是切片?
通过索引可以获取序列式容器中的某个元素, 切片语法主要用于获得一个指定索引区间的多个元素, 例如获取从索引
值为 0 到索引值为 5 之间的所有元素.
如何学习容器?
容器用来存储多个元素, 针对元素的操作提供了一些操作方法, 比如添加一个元素、删除一个元素、修改一个元素、
对容器中的元素排序等等.
学习容器类型就是在学习容器的特点、以及容器对元素的操作.
上面所说的 "方法", 就是我们所说所学的函数, 本质上 "方法"和"函数"指的是同一个东西, 只不过我们将某个类型专
属的一些函数叫做方法.
41软件测试
广州博才科技开发有限公司
迅捷PDF编辑器
3.1 字符串
学习目标:
1. 能够说出如何定义一个字符串
2. 能够说出字符串容器的特性
3. 能够说出如何对字符串中的子串进行替换
4. 能够说出如何对字符串中的字符串进行查找
5. 能够说出如何去除字符串两侧的空格
6. 能够说出如何判断字符串是否全部为字母
7. 能够说出字符串如何根据某个分隔符进行切分
8. 能够使用切片语法获得指定索引区间的子串
9. 能够说出如何使用 while 和 for 循环来遍历字符串
3.1.1 字符串语法格式
我们知道数据是有类型的, 现实生活中很多数据都仅仅是一个字符序列, 计算机如何表示字符序列的信息, 使用字符
串类型.
如何定义字符串?
1. 字符串使用一对单引号来定义.
2. 字符串使用一对双引号来定义.
3. 字符串使用一对三引号来定义.
一般我们在定义字符串时候, 使用两个单引号或者两个双引号, 很少使用三引号.
3.1.2 字符串操作
3.1.2.1 字符串遍历
字符串属于序列式容器, 支持依据索引的操作.
42软件测试
广州博才科技开发有限公司
迅捷PDF
我们可以使用
注意: 序列式容器的索引都是以
while 循环来访问字符串容器中的每一个字符元素
0 开始的, 并不是从 1 开始.
. 编辑器
my_string = '我叫做司马狗剩,我今年10岁了!'
i = 0
while i < len(my_string):
print(my_string[i], end=' ')
i += 1
Python 是一门简单易用的语言, 对于容器的遍历, 提供了另外一种简单方式, for 循环.
my_string = '我叫做司马狗剩,我今年10岁了!'
for ch in my_string:
print(ch, end=' ')
3.1.2.2 字符串替换
我们现在已经存储了一首诗歌:
poetry = '远看泰山黑乎乎, 上头细来下头粗. 茹把泰山倒过来, 下头细来上头粗.'
诗歌中的茹正确写法应该是如, 我们需要用程序解决这个问题, 如何做?
1. 查找到错别字茹.
2. 将错别字替换成正确的如字.
43软件测试
广州博才科技开发有限公司
迅捷PDF编辑器
我们可使用字符串的 replace 方法完成上面两步. 该方法默认会将字符串中所有指定字符或子串替换为新的字符串,
我们可以指定第三个参数, 替换多少次.
poetry = '远看泰山黑乎乎, 上头细来下头粗. 茹把泰山倒过来, 下头细来上头粗. 茹'
# 将所有的 '茹' 替换为 '如'
right_poetry = poetry.replace('茹', '如')
# 只替换第一次出现的 '茹'
right_poetry = poetry.replace('茹', '如', 1)
3.1.2.3 字符串查找和切片
现在有一邮箱地址如下:
user_email = 'simagousheng@itcast.cn'
我们希望从邮箱地址字符串中获取用户名和邮箱后缀名, 那么这个问题如何解决?
1. 由分析可知, @符号之前为用户名, @符号之后的内容为邮箱后缀名.
2. 首先获得 @ 符号的位置, 从开始位置截取到 @ 符号位置, 即可获得用户名.
3. 从 @ 符号位置开始截取到字符串最后, 即可获得邮箱后缀名.
如何获得 @ 符号的位置?
我们可以使用字符串提供的 find 方法, 该方法可返回查找字符串第一次出现的位置, 查找字符串不存在则会返回-1.
备注: find 方法默认从字符串开始位置(0位置)开始查找, 我们也可以指定从哪个位置范围开始查找, 设置 find 的第二
个参数表示从哪个位置开始查找, 第三个参数, 表示查找结束位置.
poetry = '远看泰山黑乎乎, 上头细来下头粗. 茹把泰山倒过来, 下头细来上头粗.'
# 从 10 位置开始查找 '上'
position = poetry.find('上', 10, 100)
如何获得指定范围的字符串?
字符串属于序列式容器, 可以根据索引获得某一个字符, 也可以根据由两个索引标识的区间获得区间内的字符序列.
poetry = '远看泰山黑乎乎, 上头细来下头粗. 茹把泰山倒过来, 下头细来上头粗.'
# 从0位置开始到7位置之前, 不包含7位置字符
print(poetry[0: 7])
# 起始位置不写, 默认就是0
print(poetry[: 7])
# 从0位置开始到最后, 结束位置不写默认字符最后一个位置的下一个位置.
print(poetry[9:])
# 步长, 每隔2个字符选取一个字符, 组成一个序列
print(poetry[0: 7: 2])
# 如果步长为负数, 那么起始位置参数和结束位置参数就会反过来.
print(poetry[6:: -1])
# 位置也可以使用负数
print(poetry[-3: -1])
print(poetry[-3:])
print(poetry[::-1])
下面我们看看如何解决这个问题?
user_email = 'simagousheng@itcast.cn'
# 查找 @ 位置
position = user_email.find('@')
44软件测试
广州博才科技开发有限公司
迅捷PDF编辑器
# 根据 postion 截取用户名和邮箱后缀
user_name = user_email[: position]
mail_suffix = user_email[position + 1:]
另外一种解决该问题的思路.
1. 先根据 @ 符号将邮箱分割成两部分.
2. 分别获取每一部分, 即可得到用户名和邮箱后缀.
user_email = 'simagousheng@itcast.cn'
# 判断 user_email 是否有多个 @
at_count = user_email.count('@')
if at_count > 1:
print('邮箱地址不合法, 出现了多个@符号!')
else:
# 根据 @ 将字符串截取为多个部分
result = user_email.split('@')
# 输出用户名和邮箱后缀
print(result[0], result[1])
疑惑: 老师解决一个问题你给我们讲了好几个方法, 我应该用那个?
这个问题非常简单, 你如何思考这个问题, 根据你解决思路, 选择来使用即可. 这些方法无优劣之分.
3.1.2.4 字符串去除两侧空格、是否为字母
我们经常在各个网站进行会员注册, 一般注册的处理流程如下:
1. 获得用户输入的注册用户名.
2. 用户在输入用户名时, 可能在用户名两个不小心输入多个空格. 我们需要去除用户名两侧的空格.
3. 判断用户名是否全部为字母(用户名的组成由我们来规定, 这里我们规定必须是字母)
4. 处理完毕之后, 显示注册成功.
# 获得用户注册用户名
register_username = input('请输入您的用户名:')
# 去除用户名两侧的空格
register_username = register_username.strip()
# 判断字符串是否全部为字母
if register_username.isalpha():
print('恭喜您:', register_username, '注册成功!')
else:
print('注册失败!')
3.1.3 小结
1. 字符串一般使用两个双引号或两个单引号来定义.
2. 字符串容器特点: 元素不能修改, 并且只能由一系列字符组成.
3. 字符串是序列式容器, 支持下标索引和切片操作, 索引支持正数和负数.
4. 切片语法由开始索引、结束索引、步长组成, 语法格式如: my_str[start: end: step] 4.1 开始索引省略默认为0.
4.2 结束索引省略默认为最后一个元素的索引的下一个索引. 4.3 步长省略默认为 1. 4.4 步长为负数时, 开始索
引就变成结束索引, 结束索引就变成开始索引. 4.5 切片的索引区间为左闭右开.
5. 字符串遍历可以使用 while 循环, 也可以使用 for 循环.
6. 字符串的 find 方法用于查找指定子串是否存在, 存在则返回出现的索引位置, 否则返回-1.
7. 字符串的 repalce 方法用于替换字符串中的指定子串, 注意, 不会修改原字符串. 会返回一个替换后的新字符串.
8. 字符串的 count 方法返回指定子串出现的次数.
45软件测试
广州博才科技开发有限公司
迅捷PDF编辑器
9. 字符串的 split 方法根据指定的分割字符串, 将原字符串分割成多个部分, 以列表形式返回.
10. 字符串的 strip 方法去除字符串两侧空格.
11. 字符串的 isalpha 方法判断字符串是否全部为字母组成.
46
没有不会的技术,只有你想不到的技术。。。。。。。。。。。。。。
原文地址:https://www.cnblogs.com/zenghongfei/p/11480526.html