Day15读后有感

今日内容概要

  • 三元表达式(简化代码)

  • 各种生成式(简化代码)

  • 匿名函数(简化代码)

  • 常见重要内置函数

  • 常见内置函数补充

 

三元表达式

语法结构

  值1 if 条件 else 值2
  条件如果成立则使用值1 (if前面的数据)
  条件如果不成立则使用值2 (else后面的数据)

 

使用场景

  三元表达式只用于二选一的情况 

username = input('username>>>:').strip()
res = '漂亮小姐姐' if username == 'anna' else '小姐姐' # 如果条件anna成立,那么打印漂亮小姐姐,输入其他就打印小姐姐
print(res)

  最好不要嵌套使用(语法不简洁) 

res = '下午' if 1 == 1 else (2 if 2==3 else '上午')  # 不推荐

  补充:针对if分支结构 也有简化版本(了解即可)
  '''子代码块都只有简单的一行情况下 也可以简写 没有三元表达式简单 但是也有人用'''

name = 'jason'
if name == 'jason': print(name)
else: print('嘿嘿嘿')

各种生成式

1.列表生成式

name_list = ['jason', 'kevin', 'tony', 'oscar', 'jerry']
'''需求:将列表中所有的人名后面加上_棒棒哒'''
# 以我们之前掌握的知识,可以用到for循环
# 1.创建一个空的列表用于存储修改之后的数据
new_list = []
# 2.for循环列表获取每一个人名
for name in name_list:  # 'jason'    'kevin'   字符串
    # 3.字符串末位拼接_棒棒哒
    res = name + '_棒棒哒'
    # 4.添加到新的列表中
    new_list.append(res)
print(new_list)  # 这样的书写方式好麻烦呀~
# 有没有简单的办法??请继续往下瞧

# 列表生成式:该技术可以简化代码 (就问你6不6)
res = [name+'_棒棒哒' for name in name_list]
# print(res)
# 列表生成式复杂用法:还具备筛选能力(不能再6了)
res = [name+'_棒棒哒' for name in name_list if name == 'jason']
print(res)
res = [name+'_棒棒哒' for name in name_list if name != 'jason']
print(res)

  

 2.字典生成式 

l1 = ['name', 'age', 'pwd']
l2 = ['anna', 18, 188]
# 需求:将上述两个列表分别制作成字典的键值
# 1.定义一个空字典
# new_dict = {}
# 2.每次循环都要拿到两个列表中对应的元素(索引相等)
# for i in range(len(l1)):
# 3.索引取值即可
# new_dict[l1[i]] = l2[i]
# print(new_dict)
# 字典生成式
res = {l1[i]: l2[i] for i in range(len(l1))}
print(res)  # {'name': 'anna', 'age': 18, 'pwd': 188}
res = {l1[i]: l2[i] for i in range(len(l1)) if i == 1}
print(res)  # {'age': 18}

  

3.集合生成式

res = {i for i in range(10)}
print(res, type(res))  # {0, 1, 2, 3, 4, 5, 6, 7, 8, 9} <class 'set'>
res = {i for i in range(10) if i != 2}
print(res, type(res))  # {0, 1, 3, 4, 5, 6, 7, 8, 9} <class 'set'>

"""没有元组生成式 依据上述写法得到的是后续我们要学习的知识:迭代器"""

  

匿名函数 lambda 音译:兰姆达

  函数的意思就是没有函数名,需要结合其他函数一起使用

语法结构

  lambda 形参:返回值

# 定义匿名函数
lambda x: x+2
# 如果用普通函数来表示
# def index(x):
#     return x + 2
print(lambda x: x+2)  # 运行结果是一个介绍,之前提到过匿名函数无法直接使用,需要结合其他函数一起使用

结合max:统计最大值来使用

l1 = [11,32,41,22,13,66,54,78,96,34,54,99,35]
print(max(l1))  # 直接获取数据集中最大的元素值

  

info = {
    'Aason':9999999,
    'Jacob':123,
    'zark':1000,
    'berk':33
}
# 求:薪资最高的人的姓名
print(max(info))  # zark
'''
max底层可以看成是for循环依次比较 针对字典默认只能获取到k
获取到k之后如果是字符串的英文字母 则会按照ASCII码表转成数字比较
    A~Z:65-90
    a~z:97-122
'''
def index(k):
    return info[k]
print(max(info,key=index))  # key对应的函数返回什么 max就以什么做比较的依据
# 比较的是v 返回的是k    key相当于是可以更改比较规则的参数

# 上述代码可以简写 因为函数功能很单一
print(max(info, key=lambda key:info[key]))  # Aason

  

常见重要内置函数

1.map映射

l1 = [11, 22, 33, 44, 55]
# 需求:元素全部自增10
# 方式1:列表生成式
# 方式2:内置函数
def index(n):
    return n + 10
res = map(index,l1)
print(list(res))  # 转成列表  代码结果[21, 32, 43, 54, 65]

# 也可以使用匿名函数的方式
res = map(lambda x: x + 10, l1)  # 转成匿名函数
print(list(res))  # 代码结果[21, 32, 43, 54, 65]

 2.zip拉链

l1 = [11, 22, 33, 44]
l2 = ['jason','kevin','tony','oscar']
# 需求:将两个列表中的元素一一对应成对即可
res = zip(l1,l2) 
print(res)  # 目前想看里面的数据 用list转换一下即可
print(list(res))  # [(11, 'jason'), (22, 'kevin'), (33, 'tony'), (44, 'oscar')]  

zip也可以整合多个数据集

l1 = [11, 22, 33, 44]
l2 = ['jason','kevin','tony','oscar']
l3 = [1,2,3,4]
l4 = [55,66,77,88]
res = zip(l1,l2,l3,l4)
print(list(res))  # [(11, 'jason', 1, 55), (22, 'kevin', 2, 66), (33, 'tony', 3, 77), (44, 'oscar', 4, 88)]

'''zip整合多个数据集 如果数据集之间个数不一致 那么依据短的'''

  

3.filter过滤

l1 = [11, 22, 33, 44, 55, 66]
'''需求:筛选出大于30的元素'''
# 方式1:列表生成式
# 方式2:内置函数
def index(x):
    return x > 30
res = filter(index,l1)
print(list(res))  # [33, 44, 55, 66]

res = filter(lambda x:x>30, l1)  # 运用匿名函数
print(list(res))  # [33, 44, 55, 66]

 

4.内置函数之reduce归总

 

  作用是将所有元素相加

  '''以前是内置函数 现在是某个模块下面的子函数(后面讲)'''
  from functools import reduce

l1 = [11, 22, 33]
'''需求:讲列表中所有的元素相加'''
def index(x,y):
    return x + y
from functools import reduce
res = reduce(index,l1)  
print(res)  # 66
res = reduce(lambda x, y: x + y, l1) # 运用了匿名函数 print(res) # 66
res = reduce(lambda x, y: x + y, l1, 100) print(res) # 166 # 在列表中所有元素相加后再加100

  

常见内置函数

1.abs()  获取绝对值(不考虑正负号)
print(abs(-123))
print(abs(123))

2.all()与any()
l1 = [0, 0, 1, 0, True]
print(all(l1))  # False  数据集中必须所有的元素对应的布尔值为True返回的结果才是True
print(any(l1))  # True   数据集中只要所有的元素对应的布尔值有一个为True 返回的结果就是True

3.bin() oct() hex()  产生对应的进制数
print(bin(100))
print(oct(100))
print(hex(100))

4.bytes()  类型转换
s = '你好啊 hello world!'
print(s.encode('utf8'))  # b'\xe4\xbd\xa0\xe5\xa5\xbd\xe5\x95\x8a hello world!'
print(bytes(s, 'utf8'))  # b'\xe4\xbd\xa0\xe5\xa5\xbd\xe5\x95\x8a hello world!'
'''针对编码解码 可以使用关键字encode与decode  也可以使用bytes和str'''
s1 = '天黑了 抓紧进屋吧!!!'
# 编码
res = bytes(s1, 'utf8')
print(res)
# 解码
res1 = str(res, 'utf8')
print(res1)

5.callable()  判断当前对象是否可以加括号调用
name = 'jason'
def index():pass
print(callable(name))  # False  变量名不能加括号调用
print(callable(index))  # True  函数名可以加括号调用

6.chr()、ord()  字符与数字的对应转换
print(chr(65))  # A  根据数字转字符  依据ASCII码
print(ord('A'))  # 65  根据字符转数字  依据ASCII码

7.dir()  返回数据类型可以调用的内置方法(查看对象内部可调用的属性)
print(dir(123))
print(dir('jason'))

8.divmod()
"""
可以使用在网站的分页制作上
    问
        总共250条数据 每页展示25条 需要多少页   10页
        总共251条数据 每页展示25条 需要多少页   11页
        总共249条数据 每页展示25条 需要多少页   10页
"""
print(divmod(250,25))  # (10, 0)  第一个参数是整数部分 第二个是余数部分
print(divmod(251,25))  # (10, 1)
print(divmod(249,25))  # (9, 24)
def get_page_num(total_num,page_num):  # 后面django分页器使用
    more,others = divmod(total_num, page_num)
    if others:
        more += 1
    print('需要%s页'%more)
get_page_num(1000,30)

9.enumerate()  枚举
name_list = ['jason', 'kevin', 'oscar', 'tony']
for name in name_list:
    print(name)

for i,j in enumerate(name_list):
    print(i,j)  # i类似于是计数 默认从0开始

for i,j in enumerate(name_list,start=1):
    print(i,j)  # 还可以控制起始位置

10.eval() exec()  识别字符串中的python代码  使用频率很低
print('print("有点饿了")')
eval('print("有点饿了111")')
exec('print("有点饿了222")')
res = """
for i in range(10):
    print(i)
"""
eval(res)  只能识别简单逻辑的python代码
exec(res)  能够识别具有与一定逻辑的python代码
# ps:课外扩展 可以百度搜一搜两者的实际应用

  

 

 

 

posted @ 2022-03-23 00:29  ji哩咕噜  阅读(29)  评论(0编辑  收藏  举报