《练习100》76~80

题目76

python 复制代码
# 求内积,两个包含若干个整数的等长列表,把这两个列表看成两个向量,输出这两个向量的内积
# 举例:[1,2,3]和[4,5,6] 内积为:1*4+2*5+3*6 = 32
# sourcery skip: avoid-builtin-shadow
list1 = list(range(1,4))
list2 = list(range(4,7))

sum = 0
for (i, j) in zip(list1,list2):
    sum += i * j
    
print(sum)    

# 记一笔
# 如果只用可迭代对象的各个元素
for i in list1:
    print(i)

# 如果只用可迭代对象的各个元素的index
for i in range(len(list1)):
    print(i)

# 如果用可迭代对象的各个元素的index和值
for index,value in enumerate(list1):
    print(index, value)

# 如果多个可迭代对象参与循环并且是它们的循环次数一样,可以考虑使用zip
for i,j,k in zip(range(3),range(30),range(300)):
    print(i,j,k)

import itertools
# 多重循环,可以考虑使用itertools中的一些方法(例子中的用法是工具sourcery优化给出的建议,特意查了一下,发现了新世界)
for i,j,k in itertools.product(range(3), range(3),range(3)):
    print('Multiple loops ',i,j,k)

题目77

python 复制代码
# 求列表中绝对值最大的数据
# 给定:[1,253,-254,86,78] 输出-254
# 求绝对值的函数是abs

list1 = [1,253,-254,86,78]
#  方法1:自己写
# 思路,利用sorted()排一下序就行了
print(sorted(list1,key=abs)[-1])
print(sorted(list1,key=abs,reverse=True)[0])

# 方法2:max这个函数也有支持自定义比较函数的版本
print(max(list1,key=abs))

题目78

python 复制代码
# 将字符串转换为字典
# 输入:'k:1|k1:2|k2:3|k3:4'
# 输出:{'k':1,'k1':2,'k2':3,'k3':4}

# 考察的是字符串的分割
# str.split(sep) : 把字符串按sep分割,然后结果存在一个列表中,这个列表就是这个函数的返回值
def str2dict(str_in:str):
    ret = {}
    sub = str_in.split('|')
    print(sub)
    
    for value in sub:
        sub2 = value.split(':')
        ret[sub2[0]] = int(sub2[1])  # 根据结果来看,将'1' 变为1
        
        # 另外一种写法(也是答案的写法):python是支持给多个变量赋值的
        # key,val = value.split(':')
        # ret[key] = int(val)
        
    print(ret)
    return ret    
str1 = 'k:1|k1:2|k2:3|k3:4'
str2dict(str1)

# 字典还有字典的推导:
# dict1 = {k:int(v) for va in str1.split('|')  k,v = va.split(':')} # 这个会报语法错误,赋值语句不能出现在推导式中?
# dict1 = {k:int(v) for va in str1.split('|') for k,v in va.split(":")} # 这个也会报错,每一次循环,只能获取一个值

dict1 = {k:int(v) for va in str1.split('|') for k,v in (va.split(":"),)} # 这个写法,符合语法。但是没想通
# 疑惑点1:  for k,v in (va.split(':'),) 在我的设想中 k的值来源于va.split(':'), v的值来源于后面的那个空的
# 疑惑点2:k,v 这个样式出现在循环中时,其值到底时怎么给的。
print(dict1)


# 验证一下
list1 = [1,2,3,4]
list2 = [2,3,4,5]
# for k,v in (list1,list2): # 这个也报错, too many values to unpack (expected 2)
#     print(k,v)

some = (list1,)
some1 = [list1,]
print(some)
print(some1)

# for k,v in (range(1),): not enough values to unpack (expected 2, got 1)
#     print(k,v)

# for k,v in (range(3),):  # too many values to unpack (expected 2)
#     print(k,v)

# 基本明确了:
# 在循环中,循环变量k,v看作一个整体,于可迭代对象的中的每一个元素匹配。
# list2 = [[1,2],[1,2,3]]

# for k,v in list2:
#     print(k,v) # 在与list2的第二个元素匹配的时候,发现第二个元素中的值的数量与k,v不匹配,报错too many values to unpack (expected 2)

# dict1 = {k:int(v) for va in str1.split('|') for k,v in (va.split(":"),)} 之所以加个逗号,是因为逗号才是元组的关键符号,可以改为列表

dict1 = {k:int(v) for va in str1.split('|') for k,v in [va.split(":")]}
print(dict1)

# 继续了解推导式 {k:int(v) for va in str1.split('|')  k,v = va.split(':')} 报错的问题
# 推导式中不能出现赋值语句?
# 看一下推导式的基本语法
# 以列表推导式举例:[ expression for item in iterable if condition ]
# 能出现赋值语句的地方是expression 
list1 = {v:=i for i in range(10)} # 用=不行,可以用海象运算符:= ,直接改为{v for v in range(10)}看起来不舒服些?
print(list1)

# 还是看看字典的推导的语法吧
# 找到两种格式
# 第一种格式:
# new_dictionary = {key_exp:value_exp for key, value in dict.items() if condition}
# 第二种格式:
# new_dictionary = {key_exp:value_exp1 if condition else value_exp2 for key, value in dict.items()}

#用第一种格式,还是不能用=,可以用海象预算符 :=
dict1 = {(key := va.split(":")[0]):(value:=va.split(":")[1]) for va in str1.split('|')}
print(dict1)
# 虽说能成功,但是定义了两个无用的变量key和value,还得再改一下
dict1 = {va.split(":")[0]:va.split(":")[1] for va in str1.split('|')} 
print(dict1)

题目79

python 复制代码
# 设计一个函数生成指定长度的验证码,验证码由大小写字母和数字组成,不同位置上的验证码可以重复

# 构建一个池子[0-9a-zA-Z]
# 小写字母a的ASCII码为97
# 大写字母A的ASCII码为65
# 数字0的ASCII为48

# random模块里面由可以重复随机选择,并生成指定长度列表的函数
# random.choices(population, weights=None, *, cum_weights=None, k=1)
# 从 population 中有重复地随机选取元素,返回大小为 k 的元素列表。 如果 population 为空,则引发 IndexError。

# 如果指定了 weight 序列,则根据相对权重进行选择。 或者,如果给出 cum_weights 序列,则根据累积权重(可能使用 itertools.accumulate() 计算)进行选择。
# 例如,相对权重``[10, 5, 30, 5]``相当于累积权重``[10, 15, 45, 50]``。 在内部,相对权重在进行选择之前会转换为累积权重,因此提供累积权重可以节省工作量。

# 如果既未指定 weight 也未指定 cum_weights ,则以相等的概率进行选择。 如果提供了权重序列,则它必须与 population 序列的长度相同。 
# 一个 TypeError 指定了 weights 和 cum_weights 。

# weights 或 cum_weights 可使用 random() 所返回的能与 float 值进行相互运算的任何数字类型(包括整数、浮点数、分数但不包括 decimal)。
# 权重值应当非负且为有限的数值。 如果所有的权重值均为零则会引发 ValueError。

# 对于给定的种子,具有相等加权的 choices() 函数通常产生与重复调用 choice() 不同的序列。 
# choices() 使用的算法使用浮点运算来实现内部一致性和速度。 choice() 使用的算法默认为重复选择的整数运算,以避免因舍入误差引起的小偏差。
import random
def gen_captcha(length:int):  
    ranges = ''.join(chr(x) for x in range(65,65+26))
    ranges += ''.join(chr(x) for x in range(97,97+26))
    ranges += ''.join(chr(x) for x in range(48,48+10))
    return ''.join(random.choices(ranges, k=length))

for i in range(100):
    if not i % 10:
        print()
    print(gen_captcha(4),end=' ')

题目80

python 复制代码
# 输出1000以内,对3,5,7整除,余数是2的所有正整数
print([x for x in range(1,1001) if x %3 == 2 and x % 5 == 2 and x % 7 == 2])
相关推荐
湫ccc6 分钟前
《Python基础》之字符串格式化输出
开发语言·python
Red Red9 分钟前
网安基础知识|IDS入侵检测系统|IPS入侵防御系统|堡垒机|VPN|EDR|CC防御|云安全-VDC/VPC|安全服务
网络·笔记·学习·安全·web安全
mqiqe44 分钟前
Python MySQL通过Binlog 获取变更记录 恢复数据
开发语言·python·mysql
AttackingLin1 小时前
2024强网杯--babyheap house of apple2解法
linux·开发语言·python
哭泣的眼泪4081 小时前
解析粗糙度仪在工业制造及材料科学和建筑工程领域的重要性
python·算法·django·virtualenv·pygame
Ysjt | 深1 小时前
C++多线程编程入门教程(优质版)
java·开发语言·jvm·c++
ephemerals__1 小时前
【c++丨STL】list模拟实现(附源码)
开发语言·c++·list
码农飞飞2 小时前
深入理解Rust的模式匹配
开发语言·后端·rust·模式匹配·解构·结构体和枚举