python 基础100例摘选

python 基础100例摘选
参照:https://blog.csdn.net/songlh1234/article/details/91391981
部分有作者自己的修改
供参考

"""
题目001:
有四个数字1,2,3,4可以组成多少个互不相同的无重复的三位数
"""


def test001():
    arr = []
    for i in range(1, 5):
        for j in range(1, 5):
            for k in range(1, 5):
                temp = i*100+j*10+k
                if i != j and i != k and j != k:
                    arr.append(temp)
    print(arr, len(arr))


"""
题目002:企业发放的奖金根据利润(I)的多少来提成:
低于或等于10万元时,奖金可提10%;
利润高于10万元,低于20万元时,低于10万元的部分按10%提成,高于10万元的部分,可提成7.5%;
20万到40万之间时,高于20万元的部分,可提成5%;
40万到60万之间时高于40万元的部分,可提成3%;
60万到100万之间时,高于60万元的部分,可提成1.5%;
高于100万元时,超过100万元的部分按1%提成。
从键盘输入当月利润I,求应发放奖金总数?
"""


# 直接使用if-elif-else
def test002():
    profits = int(input('请输入利润:'))
    if profits <= 100000:
        bonus = profits*0.1
    elif 100000 < profits <= 200000:
        bonus = 100000*0.1 + (profits-100000)*0.075
    elif 200000 < profits <= 400000:
        bonus = 100000 * 0.175 + (profits-200000)*0.05
    elif 400000 < profits <= 600000:
        bonus = 100000 * 0.225 + (profits-400000)*0.03
    elif 600000 < profits <= 1000000:
        bonus = 100000 * 0.255 + (profits-600000)*0.015
    else:
        bonus = 100000 * 0.27 + (profits-1000000)*0.01
    print('the bonus is {}'.format(bonus))


# 使用数轴的方法
def test002_1():
    profits = int(input('请输入利润:'))
    # 奖金分界表
    arr = [1000000, 600000, 400000, 200000, 100000, 0]
    # 对应的提成率
    rate = [0.01, 0.015, 0.03, 0.05, 0.075, 0.1]
    bonus = 0
    for i in range(len(arr)):
        if profits > arr[i]:
            bonus += (profits-arr[i])*rate[i]
            profits = arr[i]
    print(bonus)


"""
题目003:一个整数,它加上100后是一个完全平方数,再加上168又是一个完全平方数,请问该数是多少?
"""


# 根据题目逻辑直接来
import math


def test003():
    for a in range(1000):
        if math.sqrt(a+100) % 1 == 0 and math.sqrt(a+168+100) % 1 == 0:
            print(a)


"""
题目004:输入某年某月某日,判断这一天是这一年的第几天?
"""


# 使用time模块中的strptime()和struct_time()的属性tm_yday,利用strptime将输入的日期转化为struct_time的时间格式,再利用属性tm_yday得到一年中哪一天
from time import strptime


def test004():
    year, month, day = input('请输入年份:'), input('请输入月份:'), input('请输入日:')
    time_str = year + '-' + month + '-' + day
    yday = strptime(time_str, '%Y-%m-%d').tm_yday
    print(f'{year}年{month}月{day}日是{year}年中的第{yday}天')


"""
题目005:输入三个整数x,y,z,请把这三个数由小到大输出。
"""


# 方法一:冒泡
def test005_1():
    x, y, z = int(input('请输入第一个数:')), int(input('请输入第二个数:')), int(input('请输入第三个数:'))
    lsit = [x, y, z]
    for j in range(len(lsit)-1):
        for i in range(1, len(lsit)):
            if lsit[i-1] > lsit[i]:
                temp = lsit[i]
                lsit[i] = lsit[i-1]
                lsit[i-1] = temp
    for a in lsit:
        print(a)
    # print(l)


# 方法二:使用sorted


def test005_2():
    x, y, z = int(input('请输入第一个数:')), int(input('请输入第二个数:')), int(input('请输入第三个数:'))
    l1 = [x, y, z]
    print('=='*5, 'sorted()', '=='*5)
    for a in sorted(l1):
        print(a)
    return


"""
题目006:斐波那契数列。
"""


# 不使用递归
def fob1(n):
    a, b = 0, 1
    i = n
    while i >= 0:
        a, b = b, a + b
        print(a)
        i -= 1


def test006():
    fob1(10)


# 使用递归
def fob(n):
    if n == 1 or n == 2:
        return 1
    else:
        return fob(n-1)+fob(n-2)


def test006_2():
    for a in range(1, 11):
        print(fob(a))
        return


"""
题目007:将一个列表的数据复制到另一个列表中。
说明:这里的复制指的是复制后两个列表的内存地址不一样的,不是直接像a=b这样
"""


# 使用copy模块中的deepcopy(),也可以使用列表的copy()方法
import copy


def test007():
    a = [1, 2, 3, 4, 5, 6, 7, 8, 9]
    b = copy.deepcopy(a)
    print(id(a), '\n', id(b))


"""
题目008:题目:输出 9*9 乘法口诀表。
"""


# 双重for循环
def test008():
    for i in range(1, 10):
        for j in range(i, 10):
            string = f'{i}×{j}={i*j}'
            print('%-7s' % string, end=' ')
        print(end='\n')


"""
题目010:暂停一秒输出,并格式化当前时间。
"""
# 使用time模块的sleep(),strftime(),localtime()
import time


def test010():
    a = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(time.time()))
    print(a)
    print('休眠5秒')
    time.sleep(5)
    b = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(time.time()))
    print(b)


"""
题目011:古典问题:
有一对兔子,
从出生后第3个月起每个月都生一对兔子,
小兔子长到第三个月后每个月又生一对兔子。
假如兔子都不死。
问每个月的兔子总数为多少?
"""


def test011():
    m1 = 1
    m2 = 0
    mm = 0
    for i in range(1, 13):
        mm = mm+m2
        m2 = m1
        m1 = mm
        print(i, '-->', m1+m2+mm)


"""
题目012:判断101-200之间有多少个素数,并输出所有素数
"""
# 素数的程序逻辑:素数不能被2到它本身开方之间的数整除。
from math import sqrt


def test012():
    print('101---200之间的素数为:')
    for num in range(101, 201):
        for i in range(2, int(sqrt(num)+1)):
            if num % i == 0:
                break
        else:
            print(num)


"""
题目013:打印出所有的"水仙花数",
所谓"水仙花数"是指一个三位数,其各位数字立方和等于该数本身。
例如:153是一个"水仙花数",因为153=1的三次方+5的三次方+3的三次方。
"""
# 此题与四叶草数是相同的思路,四叶草数指的是一个四位数。


def test013():
    for num in range(100, 1000):
        # 百位上的数
        h = num//100
        # 十位上的数
        t = (num-100*h)//10
        # 个位上的数
        o = num % 10
        if h**3+t**3+o**3 == num:
            print(f'由于{h}³+{t}³+{o}³={num},故{num}是一个水仙花数。')


"""
题目014:将一个正整数分解质因数。例如:输入90,打印出90=2*3*3*5。
"""


def test014():
    import math
    num = int(input('输入一个整数:'))
    arr = []
    while num > 1:
        for i in range(2, int(math.sqrt(num)+1)):
            if num % i == 0:
                arr.append(i)
                num = num // i
                break
        else:
            arr.append(num)
            break
    print(arr)


"""
题目015:利用条件运算符的嵌套来完成此题:学习成绩>=90分的同学用A表示,60-89分之间的用B表示,60分以下的用C表示。
"""


def test015():
    score = int(input('请输入成绩:'))
    if 100 >= score >= 90:
        print(f'{score}的评价为:A')
    elif 60 <= score <= 89:
        print(f"{score}的评价为:B")
    elif 0 <= score < 60:
        print(f'{score}的评价为:C')
    else:
        print('不好意思,你输入的成绩有误,请重新输入!!')
        return test015()


"""
题目016:输入一行字符,分别统计出其中英文字母、空格、数字和其它字符的个数。
思路:使用字符串的isalpha()--》判断是否为中英文,isspace()-->判断是否为空格,isdigit()-->判断是否为数字,等方法。
"""


def test016():
    string = input('请输入一串字符串:')
    letters, space, digit, others = 0, 0, 0, 0
    for i in string:
        if i.isalpha():
            letters += 1
        elif i.isspace():
            space += 1
        elif i.isdigit():
            digit += 1
        else:
            others += 1
    print(f"char = {letters};space = {space};digit = {digit};others = {others}")


"""
题目017:求s=a+aa+aaa+aaaa+aa...a的值,其中a是一个数字。例如2+22+222+2222+22222(此时共有5个数相加),几个数相加由键盘控制。
"""


# 为了提高大数的运算效率这里使用numpy.sum运算
def test017():
    import numpy as np
    a = input('请输入a的值:')
    add_times = int(input('请输入相加的次数:'))
    num_arr = []
    for i in range(1, add_times+1):
        num_arr.append(int(a*i))
    num_sum = np.sum([num_arr])
    num_string = '+'.join([str(i) for i in num_arr])
    # print(f'等式为:{num_string}')
    # print(f'总和为:{num_sum}')
    print(f'结果为:{num_string} = {num_sum}')


"""
题目018:一个数如果恰好等于它的因子之和,这个数就称为"完数"。例如6=1+2+3.编程找出1000以内的所有完数。
"""


def test018():
    """
    思路:先求出所有的约数(因数),再判断其和是否相等。
    :return:
    """
    for num in range(1, 1000):
        arr = []
        for i in range(1, num):
            if num % i == 0:
                arr.append(i)
        if sum(arr) == num:
            print(num)


"""
题目019:一球从100米高度自由落下,每次落地后反跳回原高度的一半;再落下,求它在第10次落地时,共经过多少米?第10次反弹多高?
"""


def test019():
    high = 100
    n = 1
    total = 0
    while n <= 10:
        total += high
        high /= 2
        total += high  # 第10次落地时,会多算一次反弹的高度,故在得出总里程时需减掉high
        n += 1
    print(f'第10次落地时,经过了{total-high}米,反弹了{high}米。')


"""
题目021:猴子吃桃问题
猴子第一天摘下若干个桃子,当即吃了一半,还不瘾,又多吃了一个
第二天早上又将剩下的桃子吃掉一半,又多吃了一个。
以后每天早上都吃了前一天剩下的一半零一个。
到第10天早上想再吃时,见只剩下一个桃子了。
求第一天共摘了多少。
"""


def test020():
    day = 10
    num = 1
    while day > 0:
        day -= 1
        num = (num+1)*2
    print(num)


"""
题目021:两个乒乓球队进行比赛,各出三人。
甲队为a,b,c三人,乙队为x,y,z三人。
已抽签决定比赛名单。有人向队员打听比赛的名单。
a说他不和x比,c说他不和x,z比,请编程序找出三队赛手的名单
"""


def test021():
    """
    思路:根据题意可知,a,b,c从[x,y,z]中找人比赛,同不能同时选择同一个人比赛,再者根据题目的要求即可求出唯一的打法
    :return:
    """
    team_a = ['x', 'y', 'z']
    for a in team_a:
        for b in team_a:
            for c in team_a:
                if a != b and a != c and c != b:
                    if a != 'x' and c != 'x' and c != 'z':
                        print(f'a与{a}比赛;b与{b}比赛;c与{c}比赛。')


"""
题目022:
打印出如下图案(菱形):
   *
  ***
 *****
*******
 *****
  ***
   *
"""


def test022():
    """
    思路:使用绝对值运算,将[0,1,2,3,4,5,6]变为[3,2,1,0,1,2,3]
    :return:
    """
    num = 7
    for i in range(num):
        blank = abs(num//2-i)
        print(' '*blank+'*'*(num-2*blank)+' '*blank)


"""
题目023:有一分数序列:2/1,3/2,5/3,8/5,13/8,21/13...求出这个数列的前20项之和。
"""


def test023():
    """
    简单粗暴,直接根据题意进行
    :return:
    """
    a, b, sum_ab = 2, 1, 0
    for i in range(20):
        sum_ab += a/b
        a = a + b
        b = a - b
    print(f'前20 项和为{sum_ab}')


"""
题目024:求1+2!+3!+...+20!的和。
"""


def test024():
    """
    思路:1、使用for循环实现
    :return:
    """
    print('---'*8+'方法一'+'---'*8)
    sum_1, product = 0, 1
    for num in range(1, 21):
        product *= num
        sum_1 += product
    print(f'和为{sum_1}')


"""
题目025:利用递归求解5!
"""


def func025(n):
    if n <= 1:
        return n
    else:
        return n*func025(n-1)


def test025():
    print(func025(5))


"""
题目026:利用递归函数调用方式,将所输入的5个字符,以相反顺序打印出来。
"""


def output(s, l1):
    if l1 == 0:
        return
    print(s[l1-1])
    output(s, l1-1)


def test026():
    s = input('the string is :')
    l1 = len(s)
    output(s, l1)


"""
题目027:有5个人坐在一起,
问第五个人多少岁?他说比第4个人大两岁。
问第4个人,他说比第3个人大两岁。
问第3个人,又说比第2个人大两岁。
问第2个人,说比第1个人大两岁。
最后问第一个人,他说是10岁。
请问第五个人多大?
"""


# def test027():
#     """
#     普通方法
#     :return:
#     """
#     m1 = 10
#     m2 = m1 + 2
#     m3 = m2 + 2
#     m4 = m3 + 2
#     m5 = m4 + 2
#     print(f'第五个人年龄为:{m5}')
def age(n):
    if n == 1:
        return 10
    else:
        return age(n-1) + 2


def test027():
    """
    使用递归
    :return:
    """
    print(f'第五个人年龄为:{age(5)}')


"""
题目028:给一个不多于5位的正整数,要求:
一、求它是几位数,
二、逆序打印出各位数字。
"""


def is_nums(nums):
    """
    除了以下的方法判断位数,还可以直接使用len()函数求出长度,但需先将int类型转为str类型
    :param nums:
    :return:
    """
    l1 = [10000, 1000, 100, 10, 1]
    # l2 = [5, 4, 3, 2, 1]
    l2 = ['五', '四', '三', '两', '一']
    for n, num in enumerate(l1):
        if 1 <= nums//num <= 9:
            print(f'{nums}是{l2[n]}位数')


def reverse_nums(nums):
    nums = nums[::-1]
    # nums = str(nums)[::-1]
    print('逆序打印正整数:')
    for s in nums:
        print(s)


def test028():
    nums = input('请输入一个不大于五位的正整数:')
    is_nums(int(nums))
    reverse_nums(nums)


"""
题目029:一个5位数,判断它是不是回文数。
回文数:正反读是一样的正整数
即12321是回文数,个位与万位相同,十位与千位相同。
"""


def test029():
    nums = input('请输入需要判断的五位数:')
    if len(nums) == 5:
        nums_reverse = nums[::-1]
        if nums == nums_reverse:
            print(f'{nums}是回文数')
        else:
            print(f'{nums}不是回文数')
    else:
        print('你输入的数字不是五位数,请重新输入!!')
        test029()


"""
题目030:请输入星期几的第一个字母来判断一下是星期几,
如果第一个字母一样,则继续判断第二个字母。
"""


def test030():
    week = ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday']
    inp = ''
    while 1:
        arr = []
        inp = inp + input('请输入一个字母:')
        for day in week:  # 挑出满足输入的星期
            if inp == day[:len(inp)]:
                arr.append(day)
        if len(arr) == 1:  # 只剩一个,说明唯一,可以输出结果
            print('以%s开头的单词是:%s' % (inp, arr[0]))
            inp = ''
        elif len(arr) == 0:  # 一个都没有说明输错了,需要重新输入
            print('没有%s开头的单词' % inp)
            inp = ''


"""
题目031:按相反的顺序输出列表的值。
"""


def list_reverse(l):
    """
    一共有两种方法:
    1、切片
    2、使用列表的reverse()方法
    :param l:
    :return:
    """
    # 切片
    print('--'*8, '方法一', '--'*8)
    l_r = l[::-1]
    print(l_r)
    # for v in l_r:
    #     print(v)
    # reverse()方法
    print('--' * 8, '方法二', '--' * 8)
    l.reverse()
    print(l)


def test031():
    l1 = [1, 52, 55, 77, 12, 122]
    list_reverse(l1)


"""
题目032:按逗号分隔列表
"""


def test032():
    """
    join函数的使用
    :return:
    """
    lt = ['55', '88', '66', '44', '11']
    s = ','.join(lt)
    print(f'the result is :{s}')


"""
题目033:求100之内的素数。
"""


def test033():
    import math
    for nums in range(2, 101):
        for n in range(2, int(math.sqrt(nums)+1)):
            if nums % n == 0:
                break
        else:
            print(nums)


"""
题目034:对10个数进行排序
"""


def nums_sort01(list_sort):
    """
    使用python内置函数
    :param list_sort:
    :return:
    """
    print(f'排序前:\n{list_sort},\n排序后为:\n{sorted(list_sort)}')


def nums_sort02(list_sort):
    """
    使用算法进行排序,这里使用了冒泡算法
    :param list_sort:
    :return:
    """
    print(f'排序前:\n{list_sort}')
    for i in range(len(list_sort)-1):
        for j in range(len(list_sort)-i-1):
            if list_sort[j] > list_sort[j+1]:
                list_sort[j], list_sort[j+1] = list_sort[j+1], list_sort[j]
    print(f'排序后:\n{list_sort}')


def test034():
    list1 = [55, 51, 54, 1, 21, 22, 99, 0, 25, 78]
    nums_sort01(list1)
    # nums_sort02(list1)


"""
题目035:求一个3*3矩阵主对角线元素之和
"""


def test035():
    """
    思路:利用列表的索引进行运算,需注意是否为奇数矩阵,奇数矩阵会重复中间的元素,要剔除。
    :return:
    """
    array = [[2, 4, 6], [1, 3, 5], [7, 8, 9]]
    sum_a = 0
    n = len(array)
    # 从左上到右下对角线
    for i in range(n):
        sum_a += array[i][i]
    # 从左下到右上对角线
    for i in range(n):
        sum_a += array[i][n-i-1]
    # 由于奇数矩阵中间元素为重复元素,需剔除
    if n % 2 == 1:
        sum_a -= array[n//2][n//2]
    print(f'主对角线元素之和为{sum_a}')


"""
题目036:有一个已经排好序的数组。现输入一个数,要求按原来的规律将它插入数组中。
"""


def test036():
    """
    题意为插入排序算法的思想
    :return:
    """
    list_sorted = [1, 11, 22, 33, 44, 55, 66, 77, 88, 99]
    print(f'已排好序的数组为{list_sorted}')
    nums = int(input('请输入需要插入的数字:'))
    for i in range(len(list_sorted)):
        if list_sorted[i] > nums:
            list_sorted.insert(i, nums)
            break
        # else:
        #     list_sorted.insert(i, nums)
        #     break
    else:
        list_sorted.append(nums)
    print(f'{nums}已插入数组中:\n{list_sorted}')


"""
题目037:两个3*3的矩阵,实现其对应位置的数据相加,并返回一个新矩阵:
X = [[12, 7, 3],
     [4, 5, 6],
     [7, 8, 9]]
Y = [[5, 8, 1],
     [6, 7, 3],
     [4, 5, 9]]
"""


def test037():
    """
    实现n*n矩阵的相加算法,思路:
    使用for循环即可;
    其实可以使用numpy库直接进行矩阵的所有运算
    :return:
    """
    x = [[12, 7, 3],
         [4, 5, 6],
         [7, 8, 9]]
    y = [[5, 8, 1],
         [6, 7, 3],
         [4, 5, 9]]
    sum_arr = [[0, 0, 0],
               [0, 0, 0],
               [0, 0, 0]]
    for i in range(len(x)):
        for j in range(len(y)):
            sum_arr[i][j] = x[i][j] + y[i][j]
    print(f'{x}和{y}矩阵的和为{sum_arr}')


def test037_01():
    """
    使用第三方库numpy进行矩阵的运算
    :return:
    """
    # 需先下载numpyku--》pip install numpy
    import numpy as np
    x = np.array([[12, 7, 3], [4, 5, 6], [7, 8, 9]])
    y = np.array([[5, 8, 1], [6, 7, 3], [4, 5, 9]])
    sum_arr = x + y
    print(f'矩阵\n{x.__str__()}\n和\n{y.__str__()}\n的和为\n{sum_arr.__str__()}')  # 这里使用__str__()直接输出矩阵,不然会带有array()符号


"""
题目038:统计 1 到 100 之和。
"""


def test038():
    """
    思路:很简单,直接遍历相加
    :return:
    """
    sum_nums = 0
    for i in range(1, 101):
        sum_nums += i
    print(f'1到100 的和为{sum_nums}')
    # 以上可以简化为一行代码
    print('--'*8)
    print(f'1到100的和为{sum(i for i in range(1,101))}')


"""
题目039:求输入数字的平方,如果平方运算后小于 50 则退出。
"""


def test039():
    """
    思路:考察 break 的使用
    :return:
    """
    while True:
        nums = float(input('请输入数字:'))
        nums_square = nums ** 2
        print(f'{nums}的平方为{nums_square}')
        if nums_square < 50:
            print(f'由于{nums}的平方小于50,故程序退出')
            break


"""
题目040:两个变量的互换
"""


def test040():
    """
    思路:经典问题,其他语言需要设置临时中间变量,python可以更简单
    :return:
    """
    nums01, nums02 = float(input('请输入第一个数字:')), float(input('请输入第二个数字:'))
    print('--------临时中间变量--------')
    temp = nums01
    nums01 = nums02
    nums02 = temp
    print(f'变量互换后:\n nums01-->{nums01},\n nums02-->{nums02}')
    print('---------python特有方法----------')
    nums03, nums04 = float(input('请输入第一个数字:')), float(input('请输入第二个数字:'))
    nums03, nums04 = nums04, nums03
    print(f'互换后的结果:\n nums03-->{nums03},\n nums04-->{nums04}')


"""
题目041:数字比较:输入两个数字,输出两个数字的大小比较情况
"""


def test041():
    nums01, nums02 = float(input('请输入第一个数字:')), float(input('请输入第二个数字:'))
    if nums01 > nums02:
        print(f'{nums01}大于{nums02}')
    elif nums01 < nums02:
        print(f'{nums01}小于{nums02}')
    elif nums01 == nums02:
        print(f'{nums01}等于{nums02}')


"""
题目042:使用lambda来创建匿名函数。
"""


def test042():
    """
    练习lambda函数的用法;lambda函数会与高级内置函数filter()和map()一起使用
    lambda语法:
    lambda 变量 : 函数需要进行的操作
    实例:输入一个数组,输出其元素平方的数组
    :return:
    """
    list1 = [1, 2, 3, 4, 5, 6, 7, 8, 9]
    list2 = list(map(lambda x: x**2, list1))  # map(func, iterable)函数:将func函数作用于可迭代对象iterator
    print(f'the result is :{list2}')


"""
题目043:输出一个随机数
"""


def test043():
    """
    对于标准库random库的使用,所有用法如下
    :return:
    """
    import random
    # 随机数操作
    random.random()  # 0.85415370477785668   # 随机一个[0,1)之间的浮点数
    random.uniform(0, 100)  # 18.7356606526         # 随机一个[0,100]之间的浮点数
    random.randrange(0, 100, 2)  # 44                    # 随机一个[0,100)之间的偶数
    random.randint(0, 100)  # 22                    # 随机一个[0,100]之间的整数
    # 随机字符操作
    seed = "1234567890abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ!@#$%^&*()_+=-"  # 任意字符串(作为随机字符种子库)
    random.choice(seed)  # 'd'               # 随机一个字符
    random.sample(seed, 3)  # ['a', 'd', 'b']   # 随机多个字符(字符可重复)
    ''.join(random.sample(seed, 3))  # '^f^'             # 随机指定长度字符串(字符可重复)
    # 随机列表操作
    random.shuffle(list)  # 列表中的元素打乱


"""
题目044:取一个整数a从右端开始的4-7位。
"""


def test044():
    """
    思路:将整数先转化为字符串,利用字符串的切片用法,最后在转回整数
    :return:
    """
    # nums = input('请输入一个大于10位的整数:')
    nums = 123456789135792468
    nums_str = str(nums)
    print(f'{nums}从右端开始的4--7位是:{nums_str[-7:-3]}')


"""
题目045:计算字符串长度。
"""


def test045():
    """
    思路:使用python内置函数len()
    :return:
    """
    string = input('请输入一个字符串:')
    print(f'字符串{string}的长度为{len(string)}')


"""
题目046:打印出杨辉三角形(前10行):
1 
1 1 
1 2 1 
1 3 3 1 
1 4 6 4 1 
1 5 10 10 5 1 
1 6 15 20 15 6 1 
1 7 21 35 35 21 7 1 
1 8 28 56 70 56 28 8 1 
1 9 36 84 126 126 84 36 9 1
"""


def test046():
    """
    不太会,参照会答案
    :return:
    """
    arr = [1]
    print(1)
    while len(arr) < 10:
        a = [0] + arr
        b = arr + [0]
        arr = [a[i]+b[i]for i in range(len(a))]
        s = [str(i) for i in arr]
        print(' '.join(s))


"""
题目047:查找字符串。
"""


def test047():
    string = input('请输入一串字符串:')
    s = input('请输入需要查找的一个字母或字符串:')
    if string.find(s) >= 0:
        print(f'你所查找的字符在{string.find(s)+1}位开始')
    else:
        print('你输入的查找条件有误!!')


"""
题目048:输入3个数a,b,c,按大小顺序输出。
"""


def test048():
    arr = []
    for i in range(3):
        a = input('请输入数字:')
        arr.append(int(a))
    arr.sort(reverse=True)  # reverse=True -->降序
    print(f'排序后的结果为:{arr}')


"""
题目049:输入数组,最大的与第一个元素交换,最小的与最后一个元素交换,输出数组。
"""


def test049():
    arr = eval(input('请输入一个数组:'))
    max_index = arr.index(max(arr))
    min_index = arr.index(min(arr))
    arr[0], arr[max_index] = arr[max_index], arr[0]
    arr[-1], arr[min_index] = arr[min_index], arr[-1]
    print(f'改变后的数组为:{arr}')


"""
题目050:有n个整数,使其前面各数顺序向后移m个位置,最后m个数变成最前面的m个数
"""


def test050():
    """
    使用列表的切片即可简单完成
    :return:
    """
    arr = eval(input('请输入一个数组:'))
    m = int(input('请输入需要移动的位数:'))
    new_arr = arr[-m:] + arr[:-m]
    print(f'变化后的结果:{new_arr}')


"""
题目051:
有n个人围成一圈,顺序排号。
从第一个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来第几号的那位。
"""


def test051():
    """
    思路:参照别人的排队进门的思路
    :return:
    """
    n = int(input('请输入参加的人数:'))
    # 先进行排序
    arr = list(range(1, n+1))
    count, a, b = 0, arr, []  # 计数器count,门外队伍a,门内队伍b
    # 开始排队进门
    while len(a+b) > 1:
        num, count = a.pop(0), count + 1
        if count % 3 != 0:  # 报数为3 的淘汰
            b.append(num)   # 没被淘汰的按顺序排好队伍b
        if len(a) == 0:  # 当门外队伍a没人时,则将门内队伍b变为门外队伍a,重新开始排队
            a, b = b, []
    print(f'最后留下的人的序号是{a[0]}')


"""
题目052:写一个函数,求一个字符串的长度,在main函数中输入字符串,并输出其长度。
"""


def test052():
    """
    函数的定义及调用
    :return:
    """
    def get_str_length(s):
        return len(s)
    if __name__ == '__main__':
        s = 'asdasdas'
        print(get_str_length(s))


"""
题目053:编写input()和output()函数输入,输出5个学生的数据记录。
"""


def test053():
    """
    依旧是函数的定义和调用
    :return:
    """
    # import sys
    # 定义input()函数
    def inp(data):
        name = input('请输入学生的姓名:')
        score = float(input('请输入该学生的成绩:'))
        data[name] = score
        print('录入成功!!')
        return data

    # 定义output()函数
    def outp(data):
        name = input('请输入需要查询的学生姓名:')
        print(f'学生{name}的成绩为{data[name]}')

    if __name__ == '__main__':
        data = dict()
        while True:
            a = input('请确认是输入数据(i);查询数据(o),退出程序(e):')
            if a.upper() == 'I':
                inp(data)
            elif a.upper() == 'O':
                outp(data)
            elif a.upper() == 'E':
                return False
            else:
                print('输入错误!!请重新输入!!')


"""
题目054:编写一个函数,输入n为偶数时,调用函数求1/2+1/4+...+1/n,当输入n为奇数时,调用函数1/1+1/3+...+1/n
"""


def func(n):
    if n % 2 == 0:
        list1 = [1/i for i in range(1, n+1) if i % 2 == 0]
        return list1, sum(list1)
    else:
        list2 = [1/i for i in range(1, n+1) if i % 2 != 0]
        return list2, sum(list2)


def test054():
    n = int(input('请输入n的值:'))
    arr, sum_arr = func(n)
    print(f'{arr}的和为{sum_arr}')


"""
题目055:
找到年龄最大的人,并输出。
person = {"Joe":18,"Mike":50,"Hajo":22,"Shanel":23}
"""


def test055():
    """
    考察字典类型值(value)的比较,解法利用一下lambda匿名函数,先对字典按value 排序,在输出最大值
    :return:
    """
    person = {'Joe': 18, 'Mike': 50, 'Hajo': 22, 'Shanel': 22}
    sorted_person = sorted(person.items(), key=lambda x: x[1], reverse=True)
    print(f'年龄最大的是{sorted_person[0][0]};年龄为{sorted_person[0][1]}岁。')


"""
题目056:
海滩上有一堆桃子,五只猴子来分。
第一只猴子把这堆桃子平均分为五份,多了一个,
这只猴子把多的一个扔入海中,拿走了一份。
第二只猴子把剩下的桃子又平均分成五份,又多了一个,
它同样把多的一个扔入海中,拿走了一份,
第三、第四、第五只猴子都是这样做的,
问海滩上原来最少有多少个桃子
"""


def test056():
    """
    暂时pass
    :return:
    """
    pass


"""
题目057:
809*??=800*??+9*?? 其中??代表的两位数, 
809*??为四位数,8*??的结果为两位数,9*??的结果为3位数。
求??代表的两位数,及809*??后的结果。
"""


def test057():
    """
    没啥可讲的,按题意直接算
    :return:
    """
    for num in range(10, 100):
        if 1000 <= 809 * num <= 9999 and 10 <= 8 * num <= 99 and 100 <= 9 * num <= 999:
            print(f'??为{num};809 * ?? 为809 * {num}={809*num}')


"""
题目058:进制之间的相互转换
"""


def test058():
    """
    直接上知识点,各个进制的转换函数
    :return:
    """
    nums = int(input('请输入需要转换的十进制数值:'))
    print(f'十进制转二进制:{bin(nums)}')
    print(f'十进制转八进制:{oct(nums)}')
    print(f'十进制转16进制:{hex(nums)}')
    print('-----其他-----')
    print(f'八进制转十进制:{int(str(nums),8)}')  # int(x,base=10) x:str类型的数值,base:进制,默认为10即十进制
    print(f'二进制转十进制:{int(str(nums),2)}')
    print(f'16进制转十进制:{int(str(nums),16)}')


"""
题目059:求0—7所能组成的奇数个数。
"""


def test059():
    """
    需要用到排列组合库:itertools,先pass
    :return:
    """
    pass


"""
题目060:计算字符串中子串出现的次数
"""


def test060():
    string = input('请输入字符串:')
    str_s = input('请输入需要统计的子串:')
    if str_s in string:
        print(f'{str_s}在{string}中出现了{string.count(str_s)}次!')
    else:
        print(f'你输入的子串{str_s}不在{string}中')


"""
题目061:从键盘输入一些字符,逐个把它们写到磁盘文件上,直到输入一个 # 为止。
"""


def test061():
    """
    文件的读取,两种方式:
    1、使用open()函数,需要在使用完后使用.close()关闭内存
    2、使用with open.. as ..;(推荐)
    :return:
    """
    while True:
        a = input('请输入内容:')
        if a != '#':
            with open('test061.txt', 'a+', encoding='utf-8') as f:
                f.write(a+'\n')
        else:
            break


"""
题目062:从键盘输入一个字符串,将小写字母全部转换成大写字母,然后输出到一个磁盘文件"test"中保存。
"""


def test062():
    """
    使用字符串的upper()方法即可将小写转换为大写
    :return:
    """
    string = input('请输入字符串:')
    with open('test062.txt', 'a+', encoding='utf-8') as f:
        f.write(string.upper()+'\n')
    print('写入成功!!')


"""
题目063:
有两个磁盘文件A和B,各存放一行字母,
要求把这两个文件中的信息合并(按字母顺序排列), 输出到一个新文件C中。
"""


def test063():
    """
    必须在该程序的目录下有test063_A.txt和test063_B.txt两个文件,内容自定
    :return:
    """
    with open('test063_A.txt', 'r+', encoding='utf-8')as f:
        a = f.read()
        print(f'test063_A中的内容为{a}')
    with open('test063_B.txt', 'r+', encoding='utf-8')as f:
        b = f.read()
        print(f'test063_B中的内容为{b}')
    with open('test063_C.txt', 'w+') as f:
        f.write(a+b)
        print('内容写入test063_C.txt 成功!!')


"""
题目064:列表转换为字典。
"""


def test064():
    """
    如果是单个列表变为字典,使用enumerate获取列表的下标index和值value,在转换为字典即可;
    如果是两个列表组合成一个字典,则使用zip()函数,将两个列表转换为对应的元组,再转换为字典。
    :return:
    """
    print('-----------单个列表转换为字典-----------')
    l1 = ['Hajo', 'Shanel', 'Komry', 'John']
    d1 = dict()
    for i, v in enumerate(l1):
        d1[i] = v
    print(f'转换结果为:{d1}')
    print('----------两个字典组合转换为字典----------')
    score_l = [99, 100, 98, 95]
    d2 = dict()
    for i, v in zip(l1, score_l):
        d2[i] = v
    print(f'转换结果为{d2}')


if __name__ == '__main__':
    def program_test():
        index = input("请输入需要运行的程序序号;例如:test001,输入001:")
        program_name = 'test'+index+'()'
        try:
            return eval(program_name)
        except NameError:
            print('程序序号输入有误;请重新输入!!!')
            return program_test()
    program_test()

你可能感兴趣的:(python基础,python,python基础)