8、函数作用域
第二题:数据转换
# 有一组用例数据如下:
cases = [
['case_id', 'case_title', 'url', 'data', 'excepted'],
[1, '用例1', 'www.baudi.com', '001', 'ok'],
[4, '用例4', 'www.baudi.com', '002', 'ok'],
[2, '用例2', 'www.baudi.com', '002', 'ok'],
[3, '用例3', 'www.baudi.com', '002', 'ok'],
[5, '用例5', 'www.baudi.com', '002', 'ok'],
]
# 要求一:把上述数据转换为以下格式
res1 = [
{'case_id': 1, 'case_title': '用例1', 'url': 'www.baudi.com', 'data': '001', 'excepted': 'ok'},
{'case_id': 4, 'case_title': '用例4', 'url': 'www.baudi.com', 'data': '002', 'excepted': 'ok'},
{'case_id': 2, 'case_title': '用例2', 'url': 'www.baudi.com', 'data': '002', 'excepted': 'ok'},
{'case_id': 3, 'case_title': '用例3', 'url': 'www.baudi.com', 'data': '002', 'excepted': 'ok'},
{'case_id': 5, 'case_title': '用例5', 'url': 'www.baudi.com', 'data': '002', 'excepted': 'ok'}
]
# 要求二:把上面转换好的数据中case_id大于3的用例数据获取出来,得到如下结果
res = [
{'case_id': 4, 'case_title': '用例4', 'url': 'www.baudi.com', 'data': '002', 'excepted': 'ok'},
{'case_id': 5, 'case_title': '用例5', 'url': 'www.baudi.com', 'data': '002', 'excepted': 'ok'}
]
"""
1207-函数作用域
截至:12月10日 18:00 下载讨论内容展示词云
第一题:简单题
1、什么是全局变量?
"""
print("在函数外面、全局范围内定义的变量,被称为全局变量")
print("~" * 50, "上面是第一题答案", "~" * 50)
print()
"""
2、什么是局部变量?
"""
print("在函数体里面定义的变量、包括参数,都被称为局部变量")
print("~" * 50, "上面是第二题答案", "~" * 50)
print()
"""
3、函数内部如何修改全局变量(如何声明全局变量 )?
"""
print("函数内部如何修改全局变量:在函数体内部使用global 变量名,然后对变量重新赋值,即可修改全局变量")
print("""举例:
name = 'lucky'
def dalao():
# global变量名,声明全局变量
global name
# 对全局变量重新赋值。修改值
name = name + '彼'
print("{} is dalao".format(name)) # 结果为 luckyboy is dalao
print(dalao()) # 结果为None,因函数里没有return,则返回None
print(name) # 结果为 luckyboy is dalao
""")
print("~" * 50, "上面是第三题答案", "~" * 50)
"""
4、写出已经学过的所有python关键字,分别写出用途?
"""
print("""
已经学过的所有python关键字:
1.set() 用途 主要作用对列表去重。
2.dict() 用途 创建一个新的字典。
3.help() 获取帮助信息,如果没有实参,解释器控制台里会启动交互式帮助系统。如果实参是一个字符串,则在模块、函数、类、方法、关键字或文档主题中搜索该字符串,并在控制台上打印帮助信息。如果实参是其他任意对象,则会生成该对象的帮助页
4.min() 返回可迭代对象中最小的元素,或者返回两个及以上实参中最小的
5.max() 返回可迭代对象中最大的元素,或者返回两个及以上实参中最大的
6.id() 返回对象的“标识值”。该值是一个整数,在此对象的生命周期中保证是唯一且恒定的。两个生命期不重叠的对象可能具有相同的 id() 值
7.enumerate() 返回一个枚举对象。iterable 必须是一个序列,或 iterator,或其他支持迭代的对象
8.input() 从键盘输入一个字符串。数据类型是字符串
9.bool() 返回一个布尔值,True 或者 False
10.eval() eval() 函数用来执行一个字符串表达式,并返回表达式的值。可以将字符串转换为python代码执行。
11.int() 返回一个基于数字或字符串 x 构造的整数对象,或者在未给出参数时返回 0,将数字/字符串转化为整数
12.str() 返回一个 str 版本的 object,将数值等 转化为字符串
13.sum() 从 start 开始自左向右对 iterable 的项求和并返回总计值.
14.float() 返回从数字或字符串 x 生成的浮点数
15.print() 将变量或字符串等输出到屏幕上
16.tuple() 将一个序列转化为元祖类型
17.format() 将 value 转换为 format_spec 控制的“格式化”表示
18.len() 返回对象的长度(元素个数)。实参可以是序列(如 string、bytes、tuple、list 或 range 等)或集合(如 dictionary、set 或 frozen set 等)
19.range() range 实际上是一个不可变的序列类型,生成一个范围的序列类型
20.type() 传入一个参数时,返回 object 的类型。 返回值是一个 type 对象,通常与 object.__class__ 所返回的对象相同
21.round() 返回 number 舍入到小数点后 ndigits 位精度的值
22.zip() 创建一个聚合了来自每个可迭代对象中的元素的迭代器
23.sorted() 根据 iterable 中的项返回一个新的已排序列表
""")
print("~" * 50, "上面是第四题答案", "~" * 50)
print()
"""
第二题:数据转换
# 有一组用例数据如下:
cases = [
['case_id', 'case_title', 'url', 'data', 'excepted'],
[1, '用例1', 'www.baudi.com', '001', 'ok'],
[4, '用例4', 'www.baudi.com', '002', 'ok'],
[2, '用例2', 'www.baudi.com', '002', 'ok'],
[3, '用例3', 'www.baudi.com', '002', 'ok'],
[5, '用例5', 'www.baudi.com', '002', 'ok'],
]
# 要求一:把上述数据转换为以下格式
res1 = [
{'case_id': 1, 'case_title': '用例1', 'url': 'www.baudi.com', 'data': '001', 'excepted': 'ok'},
{'case_id': 4, 'case_title': '用例4', 'url': 'www.baudi.com', 'data': '002', 'excepted': 'ok'},
{'case_id': 2, 'case_title': '用例2', 'url': 'www.baudi.com', 'data': '002', 'excepted': 'ok'},
{'case_id': 3, 'case_title': '用例3', 'url': 'www.baudi.com', 'data': '002', 'excepted': 'ok'},
{'case_id': 5, 'case_title': '用例5', 'url': 'www.baudi.com', 'data': '002', 'excepted': 'ok'}
]
"""
def split_change():
"""
这是一个将源数据先拆分后转换得到目标数据的函数。
下面是解题思路:
# 1.查看源数据为列表的相互嵌套;
# 2.目标数据为列表里嵌套字典,仔细看目标数据,为列表[0],与列表[1:]的组合。故需要将源数据拆分为2个子列表。
# 3.怎么将列表组合呢。百度查询的使用zip()内置函数。打印zip(a,b),得到的是[<zip object at 0x006BAE90>],
# 4.一个与列表很像的东西,可以使用list()将其转化为列表。这样就得到元祖嵌套列表,列表嵌套列表
# 5.怎么将元祖嵌套列表转化为字典呢。使用dict()内置函数。一个个取值4里面的元素转化。
# 6.综上得到目标数据,需要2步,需要使用2次遍历。先写正常调用。然后封装成函数。此次不需要传递参数。函数不传参
# 不确定结果,可以一步步print看。
:return:
"""
# 源数据,列表嵌套列表
cases = [
['case_id', 'case_title', 'url', 'data', 'excepted'],
[1, '用例1', 'www.baudi.com', '001', 'ok'],
[4, '用例4', 'www.baudi.com', '002', 'ok'],
[2, '用例2', 'www.baudi.com', '002', 'ok'],
[3, '用例3', 'www.baudi.com', '002', 'ok'],
[5, '用例5', 'www.baudi.com', '002', 'ok'],
]
# 将源数据拆分为2个列表。第一个列表a为第一个元素,第二个列表b为剩余的元素
a = cases[0]
b = cases[1:]
# print(a)
# print(b)
# zip()函数组合列表a,b,需要不断从b中取元素,获取b列表长度为c
c = len(b)
# 定义一个中间空列表d,用来接收每次list(zip(a,b))的值
d = []
for i in range(c):
d.append(list(zip(a, b[i]))) # 将list(zip(a,b))后的值通过append方法添加到空列表d中。
# print(d) # 打印出中间列表,看与目标数据的区别,继续转换
# print(d[0]) # 取出中间列表的第一个元素与目标元素第一个元素比较,看差别
# print(dict(d[0])) # 是目标答案的第一个元素。
# 下面是第二部转换,定义一个空列表用来接收最终的值。
res1 = []
for i in range(len(d)): # 循环次数为列表d的长度。
res1.append(dict(d[i]))
# print(res1)
return res1 # 使用return返回值
# print(res1[0]) # 取出第一个元素与目标元素比较。是否一致。
# 给与变量来接受函数的返回值并打印。
m = split_change()
print("要求一目标数据转换后的数据为:\n{}".format(m))
print()
"""
"""
# 下面是精简答案
def transform(cases):
# if type(cases) != list: # TODO 方法1判断输入的内容是否是列表
if not isinstance(cases, list): # TODO 方法2判断类型的,常用这种方法
print("不是list")
return
new_cases = []
title = cases[0] # 取出标题
for case in cases[1:]: # 读取除第一行下面的数据。
dict_case = {} #
# ['case_id', 'case_title', 'url', 'data', 'excepted'], title
# [1, '用例1', 'www.baudi.com', '001', 'ok'], case
for i, column in enumerate(case): # 可以同时获取索引和值,其中i为索引,column为值
dict_case[title[i]] = column
new_cases.append(dict_case)
return new_cases # 返回的是一个列表,则在上面新建一个空列表。
# if __name__ == "__main__":
# print(isinstance(1, int)) # 返回True TODO 常用来判断一个变量是什么类型。
def transform_zip(cases):
if not isinstance(cases, list): # 方法2判断类型的,常用这种方法
print("不是list")
return
# ['case_id', 'case_title', 'url', 'data', 'excepted'], title
# [1, '用例1', 'www.baudi.com', '001', 'ok'], i
# [(case_id ,1),(case_tttle,用例1)]
new_cases = []
title = cases[0]
for i in cases[1:]:
new_dict = dict(zip(title, i))
new_cases.append(new_dict)
return new_cases
cases = [
['case_id', 'case_title', 'url', 'data', 'excepted'],
[1, '用例1', 'www.baudi.com', '001', 'ok'],
[4, '用例4', 'www.baudi.com', '002', 'ok'],
[2, '用例2', 'www.baudi.com', '002', 'ok'],
[3, '用例3', 'www.baudi.com', '002', 'ok'],
[5, '用例5', 'www.baudi.com', '002', 'ok'],
]
print(transform_zip(cases))
# TODO 下面是zip函数的使用方法举例,zip之后,可以使用dict也可以使用list,后面项目实战经常使用
if __name__ == '__main__':
title = ["a","b","c"]
value = [1,2,3]
a = zip(title,value)
print(dict(a))
print(list(a))
# TODO 一般遇到行列转换时,可以使用zip转换
"""
# 要求二:把上面转换好的数据中case_id大于3的用例数据获取出来,得到如下结果
res = [
{'case_id': 4, 'case_title': '用例4', 'url': 'www.baudi.com', 'data': '002', 'excepted': 'ok'},
{'case_id': 5, 'case_title': '用例5', 'url': 'www.baudi.com', 'data': '002', 'excepted': 'ok'}
]
"""
# 目标数据为case_id大于3,是否可以排序后,切片取最后2位或前2个元素??
# 是否可以通过判断key值来返回??添加到新的空列表
# 是否可以通过判断key值来删除元素??
# 方法1.通过循环遍历根据key来取值比较,将符合条件的添加到新的空列表中
def get_item():
"""
这是一个通过循环遍历列表嵌套字典中key的值,来比较得出预期结果的函数。
:return:
"""
# n = split_change()
# print(n)
# 将第一题的结果直接复用过来
res1 = [
{'case_id': 1, 'case_title': '用例1', 'url': 'www.baudi.com', 'data': '001', 'excepted': 'ok'},
{'case_id': 4, 'case_title': '用例4', 'url': 'www.baudi.com', 'data': '002', 'excepted': 'ok'},
{'case_id': 2, 'case_title': '用例2', 'url': 'www.baudi.com', 'data': '002', 'excepted': 'ok'},
{'case_id': 3, 'case_title': '用例3', 'url': 'www.baudi.com', 'data': '002', 'excepted': 'ok'},
{'case_id': 5, 'case_title': '用例5', 'url': 'www.baudi.com', 'data': '002', 'excepted': 'ok'}
]
# 定义空列表用来接收符合的列表元素
res = []
# print(res1[0]["case_id"]) # 看取出的第一个元素是否正确
# 循环遍历的次数为源数据的长度
for i in range(len(res1)):
# 判断列表元素取出的值是否符合题目要求,符合则添加到新列表,不符合则不处理。
if res1[i]["case_id"] > 3:
# 将符合条件的从res1列表添加到空列表res中
res.append(res1[i])
return res # 返回最终的res列表的值
# 定义一个变量来接受调用函数返回的res列表,并打印
n = get_item()
print("要求二方法1 case_id大于3的用例数据为:\n{}".format(n))
print()
# 精简答案 todo 正确答案
def filter(cases, id):
new_cases = []
for c in cases:
if c["case_id"] > id:
new_cases.append(c)
return new_cases
res1 = [
{'case_id': 1, 'case_title': '用例1', 'url': 'www.baudi.com', 'data': '001', 'excepted': 'ok'},
{'case_id': 4, 'case_title': '用例4', 'url': 'www.baudi.com', 'data': '002', 'excepted': 'ok'},
{'case_id': 2, 'case_title': '用例2', 'url': 'www.baudi.com', 'data': '002', 'excepted': 'ok'},
{'case_id': 3, 'case_title': '用例3', 'url': 'www.baudi.com', 'data': '002', 'excepted': 'ok'},
{'case_id': 5, 'case_title': '用例5', 'url': 'www.baudi.com', 'data': '002', 'excepted': 'ok'}
]
a = filter(res1, 3)
print(a)
# 方法2 循环取列表里的元素(字典),根据key值比较删除不符合的元祖(字典)
def get_item2():
"""
这是一个循环获取列表里元素(字典)比较字典key值并删除不符合要求的元素的函数。
:return:
"""
# 源数据
res1 = [
{'case_id': 1, 'case_title': '用例1', 'url': 'www.baudi.com', 'data': '001', 'excepted': 'ok'},
{'case_id': 4, 'case_title': '用例4', 'url': 'www.baudi.com', 'data': '002', 'excepted': 'ok'},
{'case_id': 2, 'case_title': '用例2', 'url': 'www.baudi.com', 'data': '002', 'excepted': 'ok'},
{'case_id': 3, 'case_title': '用例3', 'url': 'www.baudi.com', 'data': '002', 'excepted': 'ok'},
{'case_id': 5, 'case_title': '用例5', 'url': 'www.baudi.com', 'data': '002', 'excepted': 'ok'}
]
# 循环遍历源数据里的元素,此处的i为一个字典
for i in res1[:]:
# 根据元素的key来删除
if i["case_id"] < 4:
# 将不符合的元素删除
res1.remove(i)
return res1
accept = get_item2()
print("要求二方法2 得出case_id大于3的用例数据为:\n{}".format(accept))
print()
# 方法3 使用匿名函数来达到目的。。。纯属百度后改编。不懂。
def get_item3():
"""
使用匿名函数来对列表嵌套字典进行排序。然后切片得到所需结果的函数。
:return:
"""
res1 = [
{'case_id': 1, 'case_title': '用例1', 'url': 'www.baudi.com', 'data': '001', 'excepted': 'ok'},
{'case_id': 4, 'case_title': '用例4', 'url': 'www.baudi.com', 'data': '002', 'excepted': 'ok'},
{'case_id': 2, 'case_title': '用例2', 'url': 'www.baudi.com', 'data': '002', 'excepted': 'ok'},
{'case_id': 3, 'case_title': '用例3', 'url': 'www.baudi.com', 'data': '002', 'excepted': 'ok'},
{'case_id': 5, 'case_title': '用例5', 'url': 'www.baudi.com', 'data': '002', 'excepted': 'ok'}
]
def get_key(x):
for k, v in x.items():
return v
res = sorted(res1, key=lambda e: get_key(e))
return res
accept1 = get_item3()
print("要求二方法3 得出case_id大于3的用例数据为:\n{}".format(accept1[-2:]))
print("~" * 50, "上面是第五题答案", "~" * 50)
"""
第三题:画出函数相关内容的思维导图或者笔记
"""