题目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])