第十三天(都是理论)

第十二天(都是理论)

无参装饰器模板、有参装饰器模板

# 无参装饰器模板
def wrapper(func):
   def inner(*args, **kwargs):
       res = func(*args, **kwargs)
       # 在被装饰对象调用后添加功能
       return res
   return inner


# 有参装饰器模板
def outer(arg):
   def wrapper(func):
       def inner(*args, **kwargs):
           res = func(*args, **kwargs)
           return res

       return inner
   return wrapper

生成器

生成器就是生成的工具

是一个‘自定义的‘迭代器,本质上是一个迭代器


如何实现生成器

单反在函数内部定义了yield,调用函数时,

函数体代码不会执行,会返回一个结果,该结果就是一个生成器


yield:

每一次yield都会网生成器对象中添加一个值。

yield只能在函数内部定义

yield可以保存函数的暂停状态


yield与return:

相同点:返回的个数都是无限制的

不同点:return只能返回一个值,yield可以返回多个值


# 自定义生成器
# def func():
#     print('hello world')
#     yield 'jinyi'
#     res = func()

面向过程编程

'''
思想!!!
面向过程编程是一门编程思想。

面向 过程 编程:
  核心是 '过程' 二字,过程 指的是一种解决问题的步骤,即先干什么再干什么
  基于该编程思想编写程序,就好比在设计一条工厂流水线,一种机械式的思维方式。

  优点:
      将复杂的问题流程化,进而简单化

  缺点:
      若修改当前程序设计的某一部分, 会导致其他部分同时需要修改, 扩展性差。

      牵一发而动全身,扩展性差。
'''


# # 1.先让用户输入用户名和密码,校验合法性
# def get_user_pwd():
#     while True:
#         # 让用户输入用户名与密码
#         username = input('请输入用户名:').strip()
#         # 校验用户名是否为 英文字母 str.isalpha 校验英文字母、中文
#         if username.isalpha():
#             break
#         else:
#             print('用户名不合法')
#
#     while True:
#         password = input('请输入密码:').strip()
#         re_password = input('请确认密码:').strip()
#         # 校验两次密码是否一致
#         if password == re_password:
#             break
#         else:
#             print('两次密码不一致。')
#
#     return username, password
#
#
# # 2.拼接用户字符串
# def cut_user_pwd(user, pwd):
#     user_pwd_str = f'{user}:{pwd}\n'
#     return user_pwd_str
#
#
# # 3.保存用户数据,写入文件中
# def save_data(user_pwd_str):
#     with open('user.txt', 'a', encoding='utf-8') as f:
#         f.write(user_pwd_str)
#
#
# # 注册功能Demo
# def register():
#     # 1.设计先让用户输入用户名和密码,校验合法性,得到合法的用户名与密码
#     user, pwd = get_user_pwd()
#
#     # 2.设计字符串的拼接, 得到拼接好的字符串
#     user_pwd_str = cut_user_pwd(user, pwd)
#
#     # 3.开始写入文件
#     save_data(user_pwd_str)
#
#
# register()

三元表达式

'''
三元表达式:

  可以将if...else...分支变成一行。

  语法:
      条件成立返回左边的值 if 判断条件 else 条件不成立返回右边的值
'''

# if 判断条件:
#     执行
# else:
#     执行


# 求两个值的大小
# 通过if...else语法
# def max2(num1, num2):
#
#     if num1 > num2:
#         return num1
#     else:
#         return num2
#
# res = max2(100, 20)
#
# print(res)

# 三元表达式
# num1 = 10
# num2 = 20
# # res = num1 if num1 > num2 else num2
# def max2(num1, num2):
#     res = num1 if num1 > num2 else num2
#     return res
#
# res = max2(num1, num2)
# print(res)

列表生成式

'''
列表生成式:
  可以一行实现生成列表。
  语法:
      list = [取出的每一个值、任意值 for 可迭代对象中取出的每一个值 in 可迭代对象]
      # for的右边是循环次数,并且可以取出可迭代对象中每一个值
      # for的左边可以为当前列表添加值
      list = [值 for 可迭代对象中取出的每一个值 in 可迭代对象]

      list = [值 for 可迭代对象中取出的每一个值 in 可迭代对象 if 判断]
'''

# 将list1中的值,依次取出,添加到new_list中
# list1 = [1, 2, 3, 4]
# new_list = []
# for line in list1:
#     new_list.append(line)
#
# print(new_list)


# 普通方式
# new_list = []
# for line in range(1, 101):
#     new_list.append(line)
# print(new_list)

# 列表生成式
# list1 = [f'1{line}' for line in range(1, 101)]
# print(list1)


# Demo: 将name_list列表中的每一个人后缀都添加_dsb
# name_list = ['jason', '饼哥(大脸)', 'sean', 'egon']
# new_name_list = [name + '_dsb' for name in name_list]
# print(new_name_list)


# 将name_list列表中的tank过滤掉,其他人后缀都添加_dsb
# name_list = ['jason', '饼哥(大脸)', 'sean', 'egon', 'tank']
# new_name_list = [name + '_dsb' for name in name_list if not name == 'tank']
# print(new_name_list)


# 只要思想不滑坡,方法总比问题多。

生成器表达式(生成器生成式)

'''
生成器表达式(生成器生成式):
  - 列表生成式: 若数据量小时采用
      [line for line in range(1, 6)] ---> [1, 2, 3, 4, 5]
      优点:
          可以依赖于索引取值,取值方便

      缺点:
          浪费资源

  - 生成器生成式: 若数据量过大时采用
      () ---> 返回生成器
      (line for line in range(1, 6)) ---> g生成器(1, 2, 3, 4, 5)

      优点:
          节省资源

      缺点:
          取值不方便
'''

# 生成一个有1000个值的生成器
g = (line for line in range(1, 1000001))
# <generator object <genexpr> at 0x00000203262318E0>
print(g)

# 列表生成式实现
list1 = [line for line in range(1, 1000001)]
print(list1)

匿名函数

'''
生成器表达式(生成器生成式):
  - 列表生成式: 若数据量小时采用
      [line for line in range(1, 6)] ---> [1, 2, 3, 4, 5]
      优点:
          可以依赖于索引取值,取值方便

      缺点:
          浪费资源

  - 生成器生成式: 若数据量过大时采用
      () ---> 返回生成器
      (line for line in range(1, 6)) ---> g生成器(1, 2, 3, 4, 5)

      优点:
          节省资源

      缺点:
          取值不方便
'''

# 生成一个有1000个值的生成器
g = (line for line in range(1, 1000001))
# <generator object <genexpr> at 0x00000203262318E0>
print(g)

# 列表生成式实现
list1 = [line for line in range(1, 1000001)]
print(list1)

内置函数

'''
生成器表达式(生成器生成式):
  - 列表生成式: 若数据量小时采用
      [line for line in range(1, 6)] ---> [1, 2, 3, 4, 5]
      优点:
          可以依赖于索引取值,取值方便

      缺点:
          浪费资源

  - 生成器生成式: 若数据量过大时采用
      () ---> 返回生成器
      (line for line in range(1, 6)) ---> g生成器(1, 2, 3, 4, 5)

      优点:
          节省资源

      缺点:
          取值不方便
'''

# 生成一个有1000个值的生成器
g = (line for line in range(1, 1000001))
# <generator object <genexpr> at 0x00000203262318E0>
print(g)

# 列表生成式实现
list1 = [line for line in range(1, 1000001)]
print(list1)

 

posted @ 2019-11-18 19:53  迎着阳光  阅读(169)  评论(0编辑  收藏  举报