函数和模块之间综合练习

# 1. 什么是迭代器? (错误:概念不标准)
"""
迭代: 指的是基于上一次结果,重复的过程(并不是单纯的重复)
器: 工具. 可以理解为定义一个函数

订正: 
迭代器指的是用来迭代取值的工具, 迭代就是一个重复的过程, 每次重复都是基于上一次的结果而继续的, 单纯的重复并不是迭代
"""

# 2. 为何要有迭代器? (正确:概念不全面)
"""
为了摆脱索引取值的局限性

补全: 为了摆脱索引取值的局限性, python提供了一种能够不依赖索引取的方式, 这就是迭代器.
"""

# 3. 什么是可迭代的对象?
"""
从语法层面上讲, 内置含有__iter__()方法
"""

# 4. 什么是迭代器对象?
"""
从语法层面上讲, 内置含有__iter__()方法和__next__()方法, 且可以通过__next__()迭代取值.
"""

# 5. 如何得到自定义的迭代器?
"""
1. 函数内定义yield关键字: 在函数内一但存在yield关键字, 调用函数并不会执行函数体代码, 会返回一个生成器对象, 生成器对象即自定义的迭代器.
2. 生成器表达式
"""

# 6. 多个叠加装饰器的加载顺序与执行顺序是?
"""
加载顺序: 自下而上
执行顺序: 自上而下
"""

# 7. 什么是三元表达式?语法是什么?
"""
三元表达式: 指的是分成3部分结构的表达式. 中间为条件, 左边为条件成立返回的值, 右边为条件不成立返回的值
语法: 条件成立时返回的值 if 条件 else 条件不成立时返回的值
"""

# 8. 递归的两个阶段是什么?(半正确:概念不标准)
"""
递推: 一层一层的调用下去
回溯: 在满足某种条件下, 一层一层的结束调用  # 补全:  满足某种结束条件, 结束递归调用, 然后一层一层返回
"""

# 9. 什么面向过程的编程思想?优缺点是?(半正确:概念不标准)
"""
面向过程: 程序执行的先后顺序, 即先干什么, 再干什么. 基于流水一样的工作方式
优点: 复杂的程序流程化, 从而简单化
缺点: 可扩展性极差


# 订正:
面向过程的编程思想:
    "过程"(核心): 过程即流程, 指的是解决问题先后顺序的步骤: 先干什么? 后干什么,接着干什么?
优点: 降低程序的复杂度, 将复杂的问题流程化, 进而简单化
缺点: 程序的可扩展性极差. 
"""

# 10. 请列举5个或以上的内置函数。
"""
print, input, chr, ord, enumerate, isinstance, len
"""

# 11. 表达式“[3] in [1, 2, 3, 4]”的值为?
"""
返回值: False
"""
# print([3] in [1, 2, 3, 4])


# 12. 转义字符’\n’的含义是?
"""
\n: 换行
"""

# 13. 任意长度的Python列表、元组和字符串中最后一个元素的下标为?
"""
下标: -1
"""

# 14. Python语句''.join(list('hello world!'))执行的结果是?
"""
执行结果: 'hello world!'
"""
# print(''.join(list('hello world!')))

# 15. Python语句list(range(1,10,3))执行结果为?
"""
[1, 4, 7]
"""
# print(list(range(1, 10, 3)))

# 16. 什么命令既可以删除列表中的一个元素,也可以删除整个列表?
"""
remove, del
"""
# li = [1, 2, 3]
# li.remove(1)
# print(li)  # [2, 3]
#
# del li[1]
# print(li)  # [2]

# 17. 已知a = [1, 2, 3]和b = [1, 2, 4],那么id(a[1])==id(b[1])的执行结果为?(小整数池范围:[-5, 256])
"""
小整数池: 
    Python 对小整数的定义是 [-5, 256] 这些整数对象是提前建立好的,不会被垃圾回收。在一个 Python 的程序中,无论这个整数处于LEGB中的哪个位置,所有位于这个范围内的整数使用的都是同一个对象.
True
"""
# a = [1, 2, 3]
# b = [1, 2, 4]
# print(id(a[1]) == id(b[1]))

# 18. 表达式 int('123') 的值为?
"""
123
"""
# print(int('123'), type(int('123')))

# 19. 切片操作list(range(10))[::2]执行结果为?
"""
[0, 2, 4, 6, 8]
"""
# print(list(range(10))[::2])

# 20. 语句sorted([1, 2, 3], reverse=True) == reversed([1, 2, 3])执行结果为? (错误:不知道原理)
"""
True # 订正: False
"""
# sorted返回的是一个列表类型, 是第二个参数没有指定reverse=True默认对列表进行升序排序
# reversed返回的是一个迭代器对象, 是在给定序列的值上返回一个反向迭代器.
# 可以理解为迭代器对象只是一堆未执行的代码, 只有在迭代取值的时候迭代器这个时候才会申请内存空间保存当前取出来的值
# res1 = sorted([1, 2, 3], reverse=True)
# print(res1)  # [3, 2, 1]
#
# res2 = reversed([1, 2, 3])
# print(res2)  # <list_reverseiterator object at 0x000001BF33B8C970>
#
# print(res1 == res2)  # False
#
# print(sorted([1, 2, 4, 2, 3, 9], reverse=True))  # [9, 4, 3, 2, 2, 1]
# print([item for item in reversed([1, 2, 4, 2, 3, 9])])  # [9, 3, 2, 4, 2, 1]

# 21. 表达式 'ab' in 'acbed' 的值为?
"""
False
"""
# print('ab' in 'acbed')

# 22. Python的哪个内置函数可以返回列表、元组、字典、集合、字符串以及range对象中元素个数?
"""
len
"""

# 23. Python哪个内置函数用来返回序列中的最大元素?

"""
max
"""

# 24. Python哪个内置函数用来返回序列中的最小元素?
"""
min
"""

# 25. Python哪个内置函数用来返回数值型序列中所有元素之和?
"""
sum
"""

# 26. 已知列表对象x = ['11', '2', '3'],则表达式 max(x) 的值为?
"""
'3'
"""
# x = ['11', '2', '3']
# print(max(x), type(max(x)))  # 3 <class 'str'>

# 27. 表达式 min(['11', '2', '3']) 的值为?
"""
'11'
"""
# print(min(['11', '2', '3']))

# 28. 已知列表对象x = ['11', '2', '3'],则表达式max(x, key=len) 的值为?(正确:概念比较模糊)
"""
'11'
"""
# x = ['11', '2', '3']
# print(max(x, key=len))  # key=len 这里指定的是长度的意思. max会把第一个参数x这个可迭代对象每次迭代完毕以后的结果作为参数传给函数len, 将函数len执行每一次传过来的值的长度进行最大值比较

# 29. 表达式 {1, 2, 3, 4} - {3, 4, 5, 6}的值为?
"""
{1, 2}
"""
# print({1, 2, 3, 4} - {3, 4, 5, 6})

# 30. 表达式set([1, 1, 2, 3])的值为?
"""
{1, 2, 3}
"""
# print(set([1, 1, 2, 3]))

# 31. 假设re模块已导入,那么表达式 re.findall('(\d)\\1+', '33abcd112') 的值为?(错误:不会使用 ==> 超纲)
"""
[]
"""
# import re
# print(re.findall('(\d)\\1+', '33abcd112'))  # ['3', '1']

# 32. 语句 print(re.match('abc', 'defg')) 输出结果为?(错误:记忆不清晰)
"""
[]  # 订正: None
"""

# 33. 表达式 list(filter(lambda x: x%2==0, range(10))) 的值为?
"""
[0, 2, 4, 6, 8]
"""
# print(list(filter(lambda x: x%2==0, range(10))))

# 34. 表达式 isinstance('abc', str) 的值为?
"""
True
"""

# 35. Python标准库random中的哪个方法作用是从序列中随机选择1个元素?
"""
random.choice([1, 2])
"""

# 36. random模块中哪个方法的作用是将列表中的元素随机乱序?(错误:记忆不清晰)
"""
import random
random.shuffle(list)
"""

# 37. 模块可以分为四类分别是什么?(半对:概念模糊)
"""
1. 由c语言编写的内置模块
2. 由c++或DDL扩展
3. 由他人编写的第三方库(包)
4. 由程序员自定义的py文件

# 订正:
1. 使用python代码编写的.py文件
2. 把一系列模块组织到一起的文件夹(包)
3. 已被编译为共享库 或 DDL的c 或 C++扩展
4. 使用c编写并链接到python解释器中的内置模块
"""

# 38. 包的作用是什么?
"""
站在模块的设计者角度: 管理并分类模块, 对不同功能的模块进行加以区分, 提高了可维护性和可扩展性
站在使用者的角度: 直接导入使用, 不需要频繁更换导入模块的方式 
"""

# 39. __init__.py文件有什么用?
"""
管理包中的模块之间的导入关系. 让使用者使用更加方便.调用其文件名默认就是调用__init__.py中的名字.
"""

# 40. 使用相对导入时的注意事项
"""
相对导入只能在包内使用, 且import语句不能使用相对导入.
"""

# 41. 模块的搜索顺序
"""
1.内存
2.硬盘(sys.path): sys.path路径列表中, 第一个路径是当前执行文件的文件夹.
"""

# 42. 有如下目录
'''
bin
    -start.py
    在start.py中有以下代码
    import core.src
core
    -src.py
'''
# 问:在pycharm中正常执行 而在cmd中执行报错 为什么?
"""
因为在pycharm中, sys.path列表中第二个值, 是当前的项目路径. 在pycharm中默认会帮你添加.
"""

# 43. datetime.now() 与 time.time() 的区别是什么?()
"""
datetime.now(): 返回的是格式化字符串形式的时间格式, 可以直接进行时间的月,日,年等等的时间的加减计算
time.time(): 返回的格式是时间戳格式, 可以通过时间戳的方式间接得进行时间的加减计算
"""

# 44. sys.argv()有什么用?
"""
用来接收终端系统命令, sys.argv会把终端中以空格分开的输入内容, 以每个元素的形式, 把输入的内容以字符串形式存入列表当中.这样便可以通过获取sys.argv执行程序.
示例:
    python3 run.py 1 2 3
    sys.argv['run.py', '1', '2', '3']
"""

# 45. 有字符串'email1:378533872@qq.com email2:333312312@163.com eamil3:alexsb123@gmail.com'(错误:re模块没练习)
# 匹配出所有的邮箱地址:['378533872@qq.com', '333312312@163.com', 'alexsb123@gmail.com']
"""
s = 'email1:378533872@qq.com email2:333312312@163.com eamil3:alexsb123@gmail.com'
res = [item.split(':')[1] for item in s.split()]
print(res)

# 订正:
import re
res = 'email1:378533872@qq.com email2:333312312@163.com eamil3:alexsb123@gmail.com'
# print(re.findall("email\d:(.*?).com", res)
print(re.findall(":(.*?@.*?com).com", res)
"""

# 46. 编写一个xml文档,存储三个好友的信息 (错误:没练习过)
"""
import xml.etree.ElementTree as ET
new_xml = ET.Element("country")

name = ET.SubElement(new_xml, "name", attrib={'update': 'yes'})
name.text = 'egon'

age = ET.SubElement(new_xml, "age", attrib={'update': 'no'})
age.text = '18'

sex = ET.SubElement(new_xml, "sex")
sex.text = 'male'

et = ET.ElementTree(new_xml)
et.write('text.xml', encoding='utf-8', xml_declaration=True)

# 或者直接创建一个.xml文件, 写入一下内容
<user_info>
    <user1>
        <name>tank</name>
        <age>17</age>
        <sex>male</sex>
    </user1>
</user_info>
"""

# 47. 编写一个json文档,存储三个好友的信息
"""
import json
dic = {'egon': {'age': 18, 'sex': 'male', 'salary': 2222}, 'tank': {'age': 16, 'sex': 'male', 'salary': 3333},
       'alex': {'age': 17, 'sex': 'male', 'salary': 4444}, }
with open('db.json', 'rt', encoding='utf-8') as f:
    json.dump(dic, f)
    
# 直接写json格式的字符串. 注意: json字符串必须用双引号指定, 不能使用单引号
{"name": "egon", "age": 18, "sex": "male"}    
{"name": "tank", "age": 19, "sex": "male"}    
{"name": "alex", "age": 20, "sex": "female"}    
"""

# 48. json模块中的load 和 loads的区别
"""
load: 将文件中的json字符串格式反序列化成python相对应的数据类型
loads: 将json字符串格式反序列化成python相对应的数据类型
"""

# 49. logging模块的默认日志级别是什么(差点没记起来)
"""
warning ---> 30
"""

# 50. 在项目中使用logging的步骤
"""
1. settings.py中设置日志字典(设置日志格式表示形式, 设置日志格式的接收者, 设置日志格式的处理者)
3. 导入import logging.config
4. 使用logging.config.dictConfig 配置日志字典
5. 使用logger_obj = logging.getLogger(__name__) 指定日志名字
6. 使用logger_obj.info() 指定日志内容
"""

# 51. 可以用来做MD5加密的模块是哪个?
"""
hashlib
"""

# 52. os和sys模块的作用?(错误: sys作用不清晰)
"""
os:  与操作系统打交道的命令
sys: 与环境变量打交道的命令. 可以存放环境变量和接收终端命令传入的环境变量等等  # 与python解释器进行交互的模块
"""

# 53. 如何生成一个随机数?
"""
import random
res = random.randint(97, 122)
print(res)
"""

# 54. 如何使用python删除一个文件?(新增用法: os.unlink)
"""
import os
os.remove('filename')  或者  os.unlink('filename')
"""

# 55. json序列化时,可以处理的数据类型有哪些?如何定制支持datetime类型?(一半不会 ==> 超纲)
"""
整型, 浮点, 字符串类型, 字典, 元组, 列表
将datetime的时间对象, 转化成时间戳这种浮点型的格式

Supports the following objects and types by default:

+-------------------+---------------+
| Python            | JSON          |
+===================+===============+
| dict              | object        |
+-------------------+---------------+
| list, tuple       | array         |
+-------------------+---------------+
| str               | string        |
+-------------------+---------------+
| int, float        | number        |
+-------------------+---------------+
| True              | true          |
+-------------------+---------------+
| False             | false         |
+-------------------+---------------+
| None              | null          |
+-------------------+---------------+
"""

# import json
# import datetime
#
# # 方法一: 使用str进行转换
# print(type(datetime.datetime.now()))  # <class 'datetime.datetime'>
# print(datetime.datetime.now())  # 2020-04-17 23:08:54.614102.  ==> 它的类型是一个对象, 打印显示是字符串格式的时间是因为, 其类timedelta内部定义了__str__内置方法.
# dic = {
#     'list': [1, 2],
#     'str': '哈哈哈哈',
#     'tuple': (1, 2),
#     'time': str(datetime.datetime.now())
# }
# print(json.dumps(dic, ensure_ascii=False))


# 方法二: 自定义类继承json.JSONEncoder, 在default中派生出自己的方法.
# class MyJson(json.JSONEncoder):  # 这里继承json.JSONEncoder, json默认就是继承JSONEncoder, 这里我们找到json的父类继承.
#     def default(self, o):  # o: 这里的o会把我们传入的参数dic(包括dic本身)都会进行循环迭代检查里面的类型. 注意: 所有的迭代取出的值都会使用迭代方式判断是否是所支持的json格式
#         # o ---> datetime.now() 交给父类的default会报错
#
#         # 在交给父类之前做一些事情
#         if isinstance(o, datetime.datetime):
#             return o.strftime('%Y-%m-%d %X')
#
#         try:
#             iterable = iter(o)
#         except TypeError:
#             pass
#         else:
#             return list(iterable)
#         # 将修改后的self与o返回给父类的default方法,继承父类default方法的功能
#         return super().default(self, o)
#
#
# dic = {
#     'list': [1, 2],
#     'str': '哈哈哈哈',
#     'tuple': (1, 2),
#     'time': datetime.datetime.now()
# }
# # 指向自己定制的MyJson类
# res = json.dumps(dic, ensure_ascii=False, cls=MyJson)
# print(res)

# 56. json序列化时,默认遇到中文会转换成unicode,如果想要保留中文怎么办?
"""
ensure_ascii=False
"""

# 57. 你工作中都用过哪些内置模块? (半对:补全)
"""
time, datetime, os, sys, logging, hashlib, json, pickle,  functools, configparser, subprocess

# 补全:
xml  # xml.etree.ElementTree
shelve
re
pathlib
"""

# 58. functools模块有什么用处 ?
"""
为装饰器对象wrapper添加被装饰对象的所有的函数属性. # 补充: 通过from functools import reduce 导入reduce函数, 进行和运算.
"""

# 59. 如何在一个function里面设置一个全局的变量?
"""
x = 10
def func():
    global x
    x = 100
print(x)  # 100
"""

# 60. 什么是深拷贝与浅拷贝?
"""
深拷贝(deepcopy): 对可变不可变类型加以区分, 如果是不可变类型则在没有被修改之前共用同一个内存地址, 但是在修改以后会新申请一个内存空间并 加以保存. 如果是可变类型则新申请一个内存空间关
联它. 而不可变类型中又会加以区分可变,不可变类型, 按照之前的方式继续执行. 以此类推.
示例: 
    import copy
    li = [1, 2, [3, 4]]
    copy.deepcopy(li)
    
浅拷贝(copy): 不区分可变,不可变类型, 只拷贝第一层, 且可变类型不会新申请内存空间. (补充: 索引类型也可以使用[:]方式进行浅拷贝)
示例:
    li = [1, 2, 3]
    li.copy()  # li[:]
"""
posted @ 2020-04-17 23:28  给你加马桶唱疏通  阅读(374)  评论(0编辑  收藏  举报