《练习100》91~95

题目91

# 自动生成字符串
# a = ['小马','小羊','小鹿']
# b = ['草地上','电影院','家里']
# c = ['看电影','听音乐','吃晚饭']
# 随机生成三个0~2的数字,若是1,0,2 ,则输出: 小羊在草地上吃晚饭
import random
a = ['小马','小羊','小鹿']
b = ['草地上','电影院','家里']
c = ['看电影','听音乐','吃晚饭']
d = [random.randint(0,2) for _ in range(3)]
print(f'{a[d[0]]}{b[d[1]]}{c[d[2]]}')

题目92

# 保留重复项
# 在一个全是字符串的列表中,保留那些只有重复相同字符的字符串。
# 单个字符的字符串被认为是重复字符串
# 输入
# ['aa','123','444','b','xyz']
# ['ann','123','4g4','de','xyz']

# 第一种利用字符串*代表重复
def is_repeat(string:str):
    return string[0]*len(string) == string

# 利用set去重,如果去重后的字符串只包含原字符串的第一个字符,说明该字符串是重复字符串
# 换个说法:去重后只有一个字符
def is_repeat1(string:str):
    return len(set(string)) == 1


list1 = ['aa','123','444','b','xyz']
list2 = ['ann','123','4g4','de','xyz']
list3=list1[:]
list4=list2[:]
print(list1)
print(list2)
list1 = [x for x in list1 if is_repeat(x)]
list2 = [x for x in list2 if is_repeat(x)]
print(list1)
print(list2)

print(list3)
print(list4)
list3 = [x for x in list3 if is_repeat1(x)]
list4 = [x for x in list4 if is_repeat1(x)]
print(list3)
print(list4)

题目93

# 给定两个值,m和n,n始终为正整数,要求返回一个最接近m的n的整倍数。如果m正好处于两个整倍数中间,则返回较大的整倍数

# 输入【47,7】
# 输出:49

m = int(input('请输入一个数字作为m:'))
n = int(input('请输入一个数字作为n:'))

# 将题目中的返回条件,换个说法,这题就简单许多(其实本身也不难)
# m 一定是介于第一个比m大的n的倍数和最后一个比m小的n的倍数之间
# 还有对‘中间’这个词语的理解: 某个数到另外两个数的距离相等,说明这个数在这两个数中间
# 根据举例的说法来看,题目中的‘中间’,应该解释为之间。42 47 49, 好了不咬文嚼字,就这样吧。

# 第一种:缺点:在m比n大很多的时候,前面浪费一定的时间
each = 1
while True:
    if each * n > m:
        print(each*n)
        break
    each += 1

# 第二种:是为了解决上一种的缺点来的
each = 1    
while True:
    if not (m + each) % n:
        print(m+each)
        break
    each += 1

题目94

# 出现顺序比较
# 给出一个全部为小写字母的字符串,并给出两个一定存在的字母a和b.当字母a在字符串中最后一次出现的位置比b第一次出现的位置还要靠前时
# 返回True否则返回False

# 获取index 使用index
# index 返回最小的index, 意思就是第一次出现的
# rindex 返回最大的index, 意思就是最后一次出现

str1 = 'zheng zai xue xi python ni xin bu'
print(str1)
char_a = input('请输入在上述字符串中的一个字母:')
char_b = input('请输入在上述字符串中的另一个字母:')

if str1.index(char_a) < str1.rindex(char_b):
    print('True')
else:
    print('False')

题目95

# 输入一个多位数字,输出一个一位数字。这个一位数是数字多位数字各位数字之和,若和不是一位数字,那么继续对和的各位数字求和,直到和为一个一位数字为止
# 第一眼就想到了递归
def sum_num(num:int):
    print('num in:', num)
    return num if num < 10 else sum_num(sum(int(x) for x in str(num)))

print(sum_num(987))

# 不用递归
def sum_num1(num:int):
    while True:
        print('num in:', num)
        if num < 10:
            return num
        num = sum(int(x) for x in str(num))

print(sum_num1(987))

# 再优化一下:break的条件是num < 10, 意思就是循环的条件是num > 9. 减少了一行
def sum_num2(num:int):
    while num > 9:
        print('num in:', num)
        num = sum(int(x) for x in str(num))
    return num
        
print(sum_num2(987))

你可能感兴趣的:(Python学习笔记,python,开发语言,学习)