函数参数习题

编写一个函数,能够接受至少2个参数,返回最小值 和最大值

import random
def double_values(*nums):
    print(nums)
    return max(nums),min(nums)
print(*double_values(*[random.randint(10,20) for _ in range(10)]))

(20, 16, 12, 12, 12, 17, 15, 17, 10, 13)
20 10

编写一个函数,接受一个参数n,n为正整数,左右两 种打印方式。要求数字必须对齐

#编写一个函数,接受参数n ,n为正整数,左右两种对齐打印方式,要求数字必须对齐。
'''

          1   6 5 4 3 2 1
        2 1     5 4 3 2 1
      3 2 1       4 3 2 1
    4 3 2 1         3 2 1
  5 4 3 2 1           2 1
6 5 4 3 2 1             1
'''

# NO 1 最基本的,打印空格方式
# 上三角
def triangle_print(n):
    for i in range(1, n+1):
        for j in range(n,0, -1):
            if i < j:
                print(' '* len(str(j)),end=' ')# 因为随着数字位数不同,宽度不同
                    # ‘12 ’   ‘100 ’  ‘1000else:
                print(j, end=' ')
        print()

triangle_print(5)

# 下三角
def triangle_print(n):
    for i in range(1, n+1):
        for j in range(1, n+1):
            if i > j:
                print(' ' * len(str(j)), end=' ')
            else:
                print(n+1-j, end=' ')
        print()

triangle_print(7)


# NO 2 使用对齐方式,问题是不知道最后一行多宽

# 思路是 九九乘法表,先都向左靠齐,在整体向右靠齐

# 上三角
def triangle_print(n):
    for i in range(1, n+1):
        s = ''
        for j in range(i, 0, -1):
            s += '{}{}'.format(j, ' ')
        print('{:>30}'.format(s)) # 这里的向右靠齐,宽度不能确定

triangle_print(10)

# 下三角
def triangle_print(n):
    for i in range(1, n+1):
        s = ''
        for j in range(n+1-i, 0, -1):
            s += '{}{}'.format(j, ' ')
        print('{:>30}'.format(s)) # 这里的向右靠齐,宽度不能确定

triangle_print(10)

# NO 3 基于第二种方法,考虑先打印最后一行,就知道向右靠齐多宽

# 上三角
def triangle_print(n):
    tail = ' ' + ' '.join([str(i) for i in range(n, 0, -1)])
    width = len(tail)
    for i in range(1, n):
        s = ''
        for j in range(i, 0, -1):
            s += '{}{}'.format(j, ' ')
        print('{:>{}}'.format(s, width+1))
    print(tail)
triangle_print(15)

# 优化:
def triangle_print(n):
    tail = ' ' + ' '.join([str(i) for i in range(n, 0, -1)])
    width = len(tail)
    for i in range(1, n):
        print('{:>{}}'.format(' '.join([str(j) for j in range(i, 0, -1)]),width))
    print(tail)
triangle_print(15)

# 下三角
def triangle_print(n):
    tail = ' ' + ' '.join([str(i) for i in range(n, 0, -1)])
    width = len(tail)
    print(tail)
    for i in range(1, n):
        print('{:>{}}'.format(' '.join([str(j) for j in range(n-i, 0, -1)]),width))

triangle_print(15)

'''

          1   6 5 4 3 2 1
        2 1     5 4 3 2 1
      3 2 1       4 3 2 1
    4 3 2 1         3 2 1
  5 4 3 2 1           2 1
6 5 4 3 2 1             1
'''
# NO 5 基于上面的思路,发现,可以通过最后一行得到所有,而不用每一行都计算。也就是切片

# 上三角
def triangle_print(n):
    tail =  ' '.join([str(i) for i in range(n, 0, -1)])
    width = len(tail)
    step = 2
    start = -1
    points = {10 ** i for i in range(1,3)}

    for i in range(1, n+1):
        print('{:>{}}'.format(tail[start:],width))
#         if len(str(i+1)) > 2:
        if i+1 in points:
            step += 1
        start = start - step
triangle_print(15)

#  下三角 # 这个版本只能取到10 ,两位数超过两个,就出现问题,因为所有的step都按照2 来算了
def triangle_print(n):
    tail =  ' '.join([str(i) for i in range(n, 0, -1)])
    width = len(tail)
    print(width)
    print(tail)

    for i in range(n - 1, 0, -1):# 10,9
        if len(str(i)) == 2:
            step = 3
        if len(str(i)) == 1:
            step = 2
        start = width - step * (n - i)# 9-2*1
        print('{:>{}}'.format(tail[-start:],width))

triangle_print(10)

# NO 6
'''

          1   6 5 4 3 2 1
        2 1     5 4 3 2 1
      3 2 1       4 3 2 1
    4 3 2 1         3 2 1
  5 4 3 2 1           2 1
6 5 4 3 2 1             1
'''
# 下三角 打印最后 一行,剩余的 遇到一个空格,就把之前的都化为空格,后面的打印,也是利用切片
def showtail(n):
    tail = ' '.join([str(i) for i in range(n, 0, -1)])
    print(tail)
    for j in range(len(tail)):
        if tail[j] == ' ':
            print(' ' * j ,tail[j+1:])
showtail(15)

 案例一:

def fn(n):
    lst = [ i for i in range(n,0,-1)]
    print(lst)
    c = len(str(n))-1
    w1 = c+2
    w2 = c+3
    for i in range(n+1,1,-1):
        space = [' ' for i in range(i-2)]
        space.extend(lst[i-2:])
        for i in range(-n,0):
            if i > -(10**c):
                print('{1:<{0}}'.format(w1,space[i]),end='')
            else:
                print('{1:<{0}}'.format(w2,space[i]),end='')
        else:
            print()

fn(11)

运行结果:

[11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1]
                                1  
                             2  1  
                          3  2  1  
                       4  3  2  1  
                    5  4  3  2  1  
                 6  5  4  3  2  1  
              7  6  5  4  3  2  1  
           8  7  6  5  4  3  2  1  
        9  8  7  6  5  4  3  2  1  
    10  9  8  7  6  5  4  3  2  1  
11  10  9  8  7  6  5  4  3  2  1 

案例变形1:

def fn(n):
    tail = "  ".join((str(i) for i in range(n,0,-1)))
    print(tail)
    width = len(tail)
    for i in range(1,n):
        print("{:>{}}".format("  ".join([str(j) for j in range(i,0,-1)]),width))
    print(tail)
fn(11)

运行结果:

11  10  9  8  7  6  5  4  3  2  1
                                1
                             2  1
                          3  2  1
                       4  3  2  1
                    5  4  3  2  1
                 6  5  4  3  2  1
              7  6  5  4  3  2  1
           8  7  6  5  4  3  2  1
        9  8  7  6  5  4  3  2  1
    10  9  8  7  6  5  4  3  2  1
11  10  9  8  7  6  5  4  3  2  1

案例二:

def fn(n):
    lst = [ i for i in range(n,0,-1)]
    print(lst)
    c = len(str(n))-1
    w1 = c+2
    w2 = c+3
    for i in range(n):
        nums = lst[i:]
        space = ['' for _ in range(i)]
        line = space.extend(nums)
        for i in range(-n,0):
            if i > -(10**c):
                print('{1:<{0}}'.format(w1,space[i]),end='')
            else:
                print('{1:<{0}}'.format(w2,space[i]),end='')
        else:
            print()

运行结果:

fn(11)
[11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1]
11  10  9  8  7  6  5  4  3  2  1  
    10  9  8  7  6  5  4  3  2  1  
        9  8  7  6  5  4  3  2  1  
           8  7  6  5  4  3  2  1  
              7  6  5  4  3  2  1  
                 6  5  4  3  2  1  
                    5  4  3  2  1  
                       4  3  2  1  
                          3  2  1  
                             2  1  
                                1 

案例变形:

def fn(n):
    tail = "  ".join(str(i) for i in range(n,0,-1))
    width = len(tail)
    for i in range(n,0,-1):
        print("{:>{}}".format("  ".join([str(j) for j in range(i,0,-1)]),width))

fn(11)

运行结果:

11  10  9  8  7  6  5  4  3  2  1
    10  9  8  7  6  5  4  3  2  1
        9  8  7  6  5  4  3  2  1
           8  7  6  5  4  3  2  1
              7  6  5  4  3  2  1
                 6  5  4  3  2  1
                    5  4  3  2  1
                       4  3  2  1
                          3  2  1
                             2  1
                                1

 

posted @ 2022-10-10 09:51  布衣梦蝶1978  阅读(86)  评论(0编辑  收藏  举报