python练习题

1、打印九九乘法表

方法一

for y in range(1,10):
    for x in range(1,10):
        if x <= y:
            print("{}x{}={}".format(x, y, x*y), end='\t')
    print()

方法二

for i in range(1, 10):
    for j in range(1, i+1): 
        print("{}*{}={} ".format(j, i, i*j), end='\t')
    print()

2、用户登录验证

  • 用户依次输入用户名和密码,然后提交验证
  • 用户不存在、密码错误,都显示用户名或密码错误提示
  • 错误3次,则退出程序
  • 验证成功则显示登录信息
user = 'user'
passwd = 'passwd'
count = 0
while True:
    u = input('pls input your username:')
    p = input('pls input your password:')
    if user == u and passwd ==p:
        print('login successful')
        break
    else:
        print('username and password do not match!')
        count += 1
    if count == 3:
        print('too many trys!')
        break

3、求100内奇数和

plus=0
for i in range(1,100,2):
    plus += i
print(plus)

4、求100内斐波那契数列

a = 0 
b = 1
print(a)
while True:
    print(b)
    a, b = b, a+b
    if b >= 100:
        break

5、求斐波那契数列第101项

方法一

x = [0,1]
for i in range(2,102):
    x.append(x[i-1]+x[i-2])
print(x[-1])

方法二

a = 0 # f(0)
b = 1 # f(1)
count = 1
while True:
    print(count, b)
    a, b = b, a + b
    if count >= 101:
        break
    count += 1

方法三

@lru_cache()
def fib(n):
	return 1 if n < 3 else fib(n-1) + fib(n-2)

递归的方式,因为使用了lru_cache进行了缓存,用空间换时间所以效率也不错,缓存保留最后计算的128(默认参数)个值。

6、打印如下菱形

   *
  ***
 *****
*******
 *****
  ***
   *

方法一
补空格

n = 7
x = n // 2
for i in range(-x, x + 1):
    print(' ' * abs(i), '*' * (n-2*abs(i)))

方法二
字符串居中

n = 7
x = n // 2
for i in range(-x, n - x):
    print("{:^{}}".format('*' * (n-2*abs(i)), n))

7、从nums = [1, (2, 3, 4), 5]中,提取其中4出来

nums = [1, (2, 3, 4), 5]
print(nums[1][2])

8、从list(range(10))中,提取第二个、第四个、倒数第二个元素

x=list(range(10))

print(x[1])
print(x[3])
print(x[-2])

9、给出3个整数,使用if语句判断大小,并升序输出

a = 7
b = 5
c = 9
if a >= b:
    a, b = b, a
if b >= c:
    b, c = c, b
print(a,b,c)

10、有一个列表lst = [1,4,9,16,2,5,10,15],生成一个新列表,要求新列表元素是lst相邻2项的和

lst = [1,4,9,16,2,5,10,15]
print([lst[i]+lst[i+1] for i in range(len(lst)-1)])

11、随机生成100个产品ID,ID格式如下

  • 顺序的数字6位,分隔符点号,10个随机小写英文字符
  • 例如 000005.xcbaaduixy
import random
string = ''.join(chr(i) for i in range(0x61,0x61+26))
for i in range(1,101):
    print("{:0>6}.{}".format(i, ''.join(random.choices(string, k = 10))))

12、编写一个函数,接受一个参数n,n为正整数,上下三角两种打印方式。要求数字必须对齐

上三角:
                            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
   12 11 10 9 8 7 6 5 4 3 2 1
13 12 11 10 9 8 7 6 5 4 3 2 1
下三角:
13 12 11 10 9 8 7 6 5 4 3 2 1
   12 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 printtoptriangle(n):
    last = " ".join(map(str, range(n, 0, -1)))
    width = len(last)
    for i in range(1, n):
        line = " ".join(map(str, range(i, 0, -1)))
        print("{:>{}}".format(line, width))
    print(last)
def printtailtriangle(n):
    last = " ".join(map(str, range(n, 0, -1)))
    width = len(last)
    
    for i in range(n, 0, -1):
        line = " ".join(map(str, range(i, 0, -1)))
        print("{:>{}}".format(line, width))
        
 
print("上三角:")
printtoptriangle(13)
print("下三角:")
printtailtriangle(13)

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

使用内建函数(还可以用sorted函数),总时间复杂度是O(2n)

def selectmaxandmin(*args):
    return max(*args), min(*args)

以下方式使用循环只运行一趟,实现时间复杂度为O(n)

def topnum(x, y, *args):
    ma, mi = (x, y) if x > y else (y, x)
    for i in args:
        if i > ma:
            ma = i
        if i < mi:
            mi = i
    return ma, mi

14、求n的阶乘

迭代法

def factorial(n):
    if n == 0:
        return 1 
    elif n > 0:
        return n*factorial(n-1)
    else:
        return None

循环法

def factorial2(n):
    final = 1
    if n == 0:
        return 1
    elif n > 0:
        for i in range(1,n+1):
            final *= i
        return final
    else:
        return None

循环法效率高于迭代。

15、解决猴子吃桃问题

猴子第一天摘下若干个桃子,当即吃了一半,还不过瘾,又多吃了一个。第二天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩下的一半零一个。到第10天早上想吃时,只剩下一个桃子了。求第一天共摘多少个桃子?
迭代法

def monkey(n):
    return 1 if n == 1 else (monkey(n-1)+1)*2
print(monkey(10))

循环法

def monkey2(n):
    total = 1
    for i in range(1,n):
        total = 2*(total+1)
    return total
print(monkey2(10))

16、复制目录

选择一个已存在的目录作为当前工作目录,在其下创建a/b/c/d这样的子目录结构并在这些子目录的不同层级生成50个普通文件,要求文件名由随机4个小写字母构成。
将a目录下所有内容复制到当前工作目录dst目录下去,要求复制的普通文件的文件名必须是x、y、z开头。
举例,假设工作目录是/tmp,构建的目录结构是/tmp/a/b/c/d。在a、b、c、d目录中放入随机生成的文件,这些文件的名称也是随机生成的。最终把a目录下所有的目录也就是b、c、d目录,和文件名开头是x、y、z开头的文件。

from pathlib import Path
import shutil
from string import ascii_lowercase
import random
basedir = Path('d:/tmp')
subpath = Path('a/b/c/d')
dst = Path('dst')
(basedir/subpath).mkdir(mode = 0o777, parents = True, exist_ok = True) #等同于mkdir -p
dirs = (subpath, *subpath.parents)[:-1] #把表示当前目录的'.'去掉
print(dirs)
files = ("".join(random.choices(ascii_lowercase, k=4)) for i in range(50))#生成文件名
for name in files: #创建文件
    (basedir/random.choice(dirs)/name).touch()
heads = set('xyz')
def ignorefiles(src, names):
    print(names)
    return set(filter(lambda name: name[0] not in heads and not Path(src, name).is_dir(), names)) #filter返回的结果是迭代器对象
shutil.rmtree(str(basedir/dst), True)
shutil.copytree(str(basedir/'a'), str(basedir/dst), ignore=ignorefiles)
print('*' * 30)
for file in (basedir/dst).rglob('*'):
    print(file)
posted @ 2021-10-14 20:13  Atlas-777  阅读(120)  评论(0)    收藏  举报