Python之基础练习题
1、执行 Python 脚本的两种方式
2、简述位、字节的关系
解:8位是一个字节
3、简述 ascii、unicode、utf-8、gbk 的关系
4、请写出 “李杰” 分别用 utf-8 和 gbk 编码所占的位数
5、Pyhton 单行注释和多行注释分别用什么?
6、声明变量注意事项有那些?
8、如何查看变量在内存中的地址?
9、执行 Python 程序时,自动生成的 .pyc 文件的作用是什么?
10、写代码
a.实现用户输入用户名和密码,当用户名为 seven 且 密码为 123 时,显示登陆成功,否则登陆失败!username = input("username>>:")password = input("password>>:")if username == "seven" and password == "123": print("OK")else: print("username or password error ! ")
b.实现用户输入用户名和密码,当用户名为 seven 且 密码为 123 时,显示登陆成功,否则登陆失败,失败时允许重复输入三次
c.实现用户输入用户名和密码,当用户名为 seven 或 alex 且 密码为 123 时,显示登陆成功,否则登陆失败,失败时允许重复输入三次
11、写代码
a. 使用while循环实现输出2-3+4-5+6...+100 的和 b. 使用for循环和range实现输出 1-2+3-4+5-6...+99 的和 c. 使用 while 循环实现输出 1,2,3,4,5, 7,8,9, 11,12 d. 使用 while 循环实现输出 1-100 内的所有奇数 e. 使用 while 循环实现输出 1-100 内的所有偶数12、分别书写数字 5,10,32,7 的二进制表示
13、简述对象和 类的关系(可用比喻的手法)
14、现有如下两个变量,请简述 n1 和 n2 是什么关系?
n1 = 123
n2 = 123
15、现有如下两个变量,请简述 n1 和 n2 是什么关系?
n1 = 123456
n2 = 123456
16、现有如下两个变量,请简述 n1 和 n2 是什么关系?
n1 = 123456
n2 = n1
17、如有一下变量 n1 = 5,请使用 int 的提供的方法,得到该变量最少可以用多少个二进制位表示?18、布尔值分别有什么?
19、阅读代码,请写出执行结果
a = "alex"
b = a.capitalize() print(a) print(b)请写出输出结果:
20、写代码,有如下变量,请按照要求实现每个功能
name = " aleX"
a. 移除 name 变量对应的值两边的空格,并输入移除有的内容
b. 判断 name 变量对应的值是否以 "al" 开头,并输出结果
c. 判断 name 变量对应的值是否以 "X" 结尾,并输出结果 d. 将 name 变量对应的值中的 “l” 替换为 “p”,并输出结果 e. 将 name 变量对应的值根据 “l” 分割,并输出结果。f. 请问,上一题 e 分割之后得到值是什么类型? g. 将 name 变量对应的值变大写,并输出结果
h. 将 name 变量对应的值变小写,并输出结果 i. 请输出 name 变量对应的值的第 2 个字符?j. 请输出 name 变量对应的值的前 3 个字符?
k. 请输出 name 变量对应的值的后 2 个字符? l. 请输出 name 变量对应的值中 “e” 所在索引位置?21、字符串是否可迭代?如可以请使用 for 循环每一个元素?
22、请用代码实现:利用下划线将列表的每一个元素拼接成字符串,li = ['alex', 'eric', 'rain']
23、写代码,有如下列表,按照要求实现每一个功能
li = ['alex', 'eric', 'rain']
a. 计算列表长度并输出 b. 列表中追加元素 “seven”,并输出添加后的列表 c. 请在列表的第 1 个位置插入元素 “Tony”,并输出添加后的列表 d. 请修改列表第 2 个位置的元素为 “Kelly”,并输出修改后的列表 e. 请删除列表中的元素 “eric”,并输出修改后的列表 f. 请删除列表中的第 2 个元素,并输出删除的元素的值和删除元素后的列表 g. 请删除列表中的第 3 个元素,并输出删除元素后的列表 h. 请删除列表中的第 2 至 4 个元素,并输出删除元素后的列表 i. 请将列表所有的元素反转,并输出反转后的列表j. 请使用 for、len、range 输出列表的索引
k. 请使用 enumrate 输出列表元素和序号(序号从 100 开始) l. 请使用 for 循环输出列表的所有元素24、写代码,有如下列表,请按照功能要求实现每一个功能
li = ["hello", 'seven', ["mon", ["h", "kelly"], 'all'], 123, 446]
a. 请输出 “Kelly”
b. 请使用索引找到 'all' 元素并将其修改为 “ALL”25、写代码,有如下元组,按照要求实现每一个功能
tu = ('alex', 'eric', 'rain')
a. 计算元组长度并输出 b. 获取元组的第 2 个元素,并输出c. 获取元组的第 1-2 个元素,并输出
d. 请使用 for 输出元组的元素
e. 请使用 for、len、range 输出元组的索引 f. 请使用 enumrate 输出元祖元素和序号(序号从 10 开始)26、有如下变量,请实现要求的功能
tu = ("alex", [11, 22, {"k1": 'v1', "k2": ["age", "name"], "k3": (11,22,33)}, 44])a. 讲述元祖的特性
b. 请问 tu 变量中的第一个元素 “alex” 是否可被修改? c. 请问 tu 变量中的"k2"对应的值是什么类型?是否可以被修改?如果可以,请在其中添加一个元素 “Seven”d. 请问 tu 变量中的"k3"对应的值是什么类型?是否可以被修改?如果可以,请在其中添加一个元素 “Seven”
27、字典
dic = {'k1': "v1", "k2": "v2", "k3": [11,22,33]}a. 请循环输出所有的 key
b. 请循环输出所有的 value
c. 请循环输出所有的 key 和 value
d. 请在字典中添加一个键值对,"k4": "v4",输出添加后的字典 e. 请在修改字典中 “k1” 对应的值为 “alex”,输出修改后的字典f. 请在 k3 对应的值中追加一个元素 44,输出修改后的字典
g. 请在 k3 对应的值的第 1 个位置插入个元素 18,输出修改后的字典28、转换
a. 将字符串 s = "alex" 转换成列表 b. 将字符串 s = "alex" 转换成元祖 c. 将列表 li = ["alex", "seven"] 转换成元组 d. 将元祖 tu = ('Alex', "seven") 转换成列表 e. 将列表 li = ["alex", "seven"] 转换成字典且字典的 key 按照 10 开始向后递增29、转码
n = "老男孩"
a. 将字符串转换成 utf-8 编码的字节,并输出,然后将该字节再转换成 utf-8 编码字符串,再输出b. 将字符串转换成 gbk 编码的字节,并输出,然后将该字节再转换成 gbk 编码字符串,再输出
30、求 1-100 内的所有数的和
31、元素分类
有如下值集合 [11,22,33,44,55,66,77,88,99,90],将所有大于 66 的值保存至字典的第一个 key 中,将小于 66 的值保存至第二个 key 的值中。即: {'k1': 大于 66 的所有值, 'k2': 小于 66 的所有值}
32、购物车 功能要求:
要求用户输入总资产,例如:2000 显示商品列表,让用户根据序号选择商品,加入购物车 购买,如果商品总额大于总资产,提示账户余额不足,否则,购买成功。
goods = [
{"name": "电脑", "price": 1999},{"name": "鼠标", "price": 10},
{"name": "游艇", "price": 20},
{"name": "美女", "price": 998},
]
# py4测试题# 1、8 << 2等于?# 将8转为二进制数0b1000,<<2表示将此二进制左移两位==》0b100000,结果为32# 2、通过内置函数计算5除以2的余数print(divmod(5,2)[1])# # 3、s = [1, "h", 2, "e", [1, 2, 3], "l", (4, 5), "l", {1: "111"}, "o"], 将s中的5个字符提取出来并拼接成字符串。s = [1, "h", 2, "e", [1, 2, 3], "l", (4, 5), "l", {1: "111"}, "o"]l=[]for i in s: if isinstance(i,str): l.append(i)result="".join(l)print(result)# # 4、判断# "yuan"是否在[123, (1, "yuan"), {"yuan": "handsome"}, "yuanhao"], 如何判断以及对应结果?if "yuan" in [123, (1, "yuan"), { "yuan": "handsome"}, "yuanhao"]: print(True)else: print(False)#判断结果为:false# 5、l = [1, 2, 3]l2 = l.insert(3, "hello")print(l2)# 执行结果并解释为什么?# 答:执行结果为None,l.insert(3, "hello")是对列表l进行添加,实际上是通过l的绑定方法insert来执行此函数,而这个函数# 没有返回值(即无return),所以执行结束后返回值为None。# # 6、 a = [1, 2, [3, "hello"], {"egon": "aigan"}]a = [1, 2, [3, "hello"], { "egon": "aigan"}]b = a[:]a[0] = 5a[2][0] = 666print(a)print(b)print(id(a),id(b))# 计算结果以及为什么?# print(a)的执行结果为[5, 2, [666, 'hello'], {'egon': 'aigan'}],print(b)的结果为[1, 2, [666, 'hello'], {'egon': 'aigan'}]# 这是因为b=a[:]是一个切片操作,在没有设定索引的情况下,就是切所有的赋值给b,这相当于浅拷贝一个b(id(b)不等于id(a)),# a,b一样的就只是最外层元素的地址引用,而在修改a[0]时,数字修改就相当于重新赋值,因此b依然指向原来的地址,而a改变了,对于a[2][0]# 的修改,对于列表的地址并没有改变,因此在a和b中都发生了改变# 7.使用文件读取,找出文件中最长的行的长度(用一行代码解决)?# print(max(open("a"),key=lambda x:len(x)))# # 8def add(s, x): return s + xdef generator(): for i in range(4): yield ibase = generator()l=[]for n in [1,11]: for i in base: a=add(i,n) l.append(a) base=iter(l)print(list(base))# 结果为:[22, 23, 24, 25]# 当n=1的时候,for i in base ,产生的i依次是0,1,2,3,在经过add函数后,base作为一个生成器里面有1,2,3,4#当n=11的时候,for i in base ,产生的i依次是1,2,3,4,在经过add函数后,base作为一个生成器里面有12,13,14,15# 9# hello.py(gbk方式保存):# #coding:GBK# print(“老男孩”)# 如果用py2,py3下在cmd下运行回报错吗?为什么并提出解决方案? (编码)# 都可以打开,因为windows系统为gbk编码,因此显示无问题# 而mac本默认编码为utf-8,可以打开,但是显示会乱码# # 10# 通过函数化编程实现5的阶乘def func(n): total=1 for i in range(1,n+1): total*=i return totalprint(func(5))# 11# 打印如下图案:# # *# ***# *****# *******# *****# ***# *for i in range(5): print("* "*(2*i-1))for i in range(3,0,-1): print("* "*(2*i-1))# # 12def outer(): count = 10def inner(): global count count = 20 print(count)inner()print(count)outer()# (1)分析运行结果?# (2)如何让两个打印都是20# 无法运行,因为count没有被定义,在print(count)的时候# (2)在inner函数中加入global count即可# 13# 输入一个年份,判断是否是闰年?def year(n): if n%100 ==0 : if n % 400==0 : print("%s是闰年"%n) else: print("%s不是闰年"%n) else: if n%4==0: print("%s是闰年" % n) else: print("%s不是闰年"%n)n=int(input("请输入年份:"))year(n)# # 14# 任意输入三个数,判断大小?def func(x,y,z): l=[x,y,z] m=1 while ml[i+1]: mid=l[i] l[i]=l[i+1] l[i+1]=mid m+=1 print(l) print("%s<%s<%s"%(l[0],l[1],l[2]))func(12,4,7)# # 15# 求s = a + aa + aaa + aaaa + aa...a的值,其中a是一个数字。例如2 + 22 + 222 + 2222 + 22222# ,几个数相加以及a的值由键盘控制。def func(a,n): l=[] for i in range(n): x=0 while i>=0: x+=(a*(10**i)) i=i-1 l.append(x) sum(l) print(l)func(2,6)# 16f = open("a")while 1: choice = input("是否显示:[Y/N]:") if choice.upper() == "Y": for i in f: print(i) else: break# 请问程序有无bug,怎么解决?# 有bug,如果打开文件时,是操作系统打开的,默认编码为GBK,如果该文件是utf-8的文件,里面包含文字的话就会出现乱码情况,因此这里应该指定编码格式# 其次这里是一个while True的死循环,在输入显示Y后,文件句柄f作为一个迭代器,只能只用一次,即使循环,再输入y也是无显示的,因此去掉死循环,或重新获得文件句柄# 在打印的时候,为了有良好的效果,最好.strip(),去掉前后的空格与换行符# 17# (1)为这些基础函数加一个装饰器,执行对应函数内容后,将当前时间写入一个文件做一个日志记录。import timedef log(func): def wrapper(*args,**kwargs): res = func(*args,**kwargs) with open("test","a",encoding="utf8")as f: f.write("在%s执行了%s"%(time.time(),func)) return res return wrapper@logdef foo(): print('hello foo') return ()@logdef bar(): print('hello bar')foo()# (2)改成参数装饰器,即可以根据调用时传的参数决定是否记录时间,比如 @ logger(True)import timedef logger(flag): def log(func): def wrapper(*args,**kwargs): res = func(*args,**kwargs) if flag: with open("test","a",encoding="utf8")as f: f.write("在%s执行了%s\n"%(time.time(),func)) return res return wrapper return log@logger(True)def foo(): print('hello foo') return ()@logger(False)def bar(): print('hello bar')foo()bar()# 18# 三次登陆锁定:要求一个用户名密码输入密码错误次数超过三次锁定?with open("user_information",encoding="utf8") as f_usr,\ open("locked",mode="a+",encoding="utf8") as f_locked : #打开用户信息文件和黑名单文件,防止有汉字加上编码 flag=True #设置标志位 count=0 #初始化变量 count_list = [] #创建一个用以放置输入错误账户名的列表 while flag and count<3: count+=1 user_name = input("please input username:") f_locked.seek(0) #因locked文件时a+模式,在读取时先将光标调至开头 for line in f_locked: #逐行读取黑名单 if user_name == line.strip(): #判断用户名是否在文件中 print("Sorry!This user has been locked!") flag=False #更改标志位,以结束最外层循环 break #结束读取黑名单文件操作 if flag: # 不在黑名单时,执行以下操作 f_usr.seek(0) #移动光标位置(此处是为了下次循环继续从头读取信息,而第一次读取,r模式下就是从开头读取) for line1 in f_usr: #读取用户信息文件 user_information = line1.strip().split("---")#将每行的用户名与密码分割成一个列表 if user_information[0]==user_name: #判断用户名是否与输入的相同,不相同则继续循环 pwd = input("please input pwd:") if user_information[1]==pwd: flag=False #匹配成功,修改标志位 print("hello %s,welcome you!"%user_name) break else: print("user_name or pwd wrong!") #否则则报错 count_list.append(user_name) #将此用户加入到计数列表中 count1=count_list.count(user_name) #计算此用户已输入错误几次 if count1 == 3: # 判断本次输入的用户错误次数是否到达3次 f_locked.write("\n" + user_name) # 到达,则加入locked文件 break else: print("User name doesn't exist!") #在逐行读取完毕,正常结束的情况下,表示无此用户名
# py4测试题# 1、8 << 2等于?#8转化成二进制:1000#向左移动2位: 0010 0000#转化成十进制:32# 2、通过内置函数计算5除以2的余数#a=divmod(5,2)#余数:# a[1] --->1## 3、s = [1, "h", 2, "e", [1, 2, 3], "l", (4, 5), "l", {1: "111"}, "o"], 将s中的5个字符提取出来并拼接成字符串。#s = [1, "h", 2, "e", [1, 2, 3], "l", (4, 5), "l", {1: "111"}, "o"]a=[]for i in s: if isinstance(i,str): a.append(i)b="".join(a)print(b)# 4、判断# "yuan" 是否在[123, (1, "yuan"), {"yuan": "handsome"}, "yuanhao"], 如何判断以及对应结果?##判断"yuan"是不是列表的元素:a=[123, (1, "yuan"), { "yuan": "handsome"}, "yuanhao"]if "yuan" in a: print("yuan in the list")# 5、l = [1, 2, 3]# l2 = l.insert(3, "hello")# print(l2)# 执行结果并解释为什么?##结果是none。因为l.insert 是给l插入值,没有返回值。## 6、a = [1, 2, [3, "hello"], { "egon": "aigan"}]b = a[:]a[0] = 5a[2][0] = 666print(a)print(b)# # 计算结果以及为什么?## a:[5,2,[666,"hello"],{"egon":"aigan"}]## b:[1,2,[666,"hello"],{"egon":"aigan"}]# 原因:这种拷贝方法。不可变类型的,原对象更改不会影响到拷贝对象,而可变类型的,原对象更改会影响到拷贝对象,# 拿列表来说,实际存储的是指向列表的内存地址。而列表里的元素只和列表有关系。# 7# 使用文件读取,找出文件中最长的行的长度(用一行代码解决)?with open("a") as f: print(max((len(i.strip()) for i in f)))# 8def add(s, x): return s + xdef generator(): for i in range(4): yield ibase = generator()for n in [1, 11]: base = (add(i, n) for i in base)print(list(base)#输出结果:[22,23,24,25]#原因:生成器有定义阶段和调用阶段,定义阶段只会定义,而不会运行,当调用这个生成器的时候才会执行。#base = [0,1,2,3]#base1 = (add(i, n) for i in [0,1,2,3])#base2 = (add(i, n) for i in base1)##最后执行base2,会依次从上往下执行,可到base1,n已经在for运行完变成了11,所以base1 = [11,12,13,14]##再执行base2 = [22,23,24,25]## 9# hello.py(gbk方式保存):# #coding:GBKprint(“老男孩”)## 如果用py2,py3下在cmd下运行回报错吗?为什么并提出解决方案? (编码)##不会出错。### 10、通过函数化编程实现5的阶乘def foo(n): sum=1*n a = 1 while a < n: sum *= a a += 1 print(sum)foo(5)## 结果:120### 11、 打印如下图案:## *# * * *# ** * **# ** ** * **# ** * **# * * *# * for i in range(1,8,2): a="*"*i print(a.center(10)) for i in range(5,0,-2): a="*"*i print(a.center(10))# 12 def outer(): count = 10 def inner(): count = 20 print(count) inner() print(count) outer()##(1)分析运行结果?#(2)如何让两个打印都是20#(1):先输出20,再输出10#(2):在inner()下加入nonlocal count,最后结果都是20了。 def inner(): nonlocal count count = 20 print(count)# 13、 输入一个年份,判断是否是闰年? a = int(input("请输入年份: ")) if a%4 ==0: if a%40 == 0: print("该年份是闰年!") else: print("该年份不是闰年!") else: print("该年份不是闰年!")### 14、 任意输入三个数,判断大小? def com(a,b,c): max = a min = a l=[a,b,c] for i in l : if i >= max: max = i else: min = i print("The max is %s " % max) print("The min is %s " % min) a=int(input("Please input the first number: ")) #6 b=int(input("Please input the second number: ")) #2 c=int(input("Please input the third number: ")) #9 com(a,b,c)# 输出结果:# The max is 9# The min is 2# 15# 求s = a + aa + aaa + aaaa + aa...a的值,其中a是一个数字。例如2 + 22 + 222 + 2222 + 22222# ,几个数相加以及a的值由键盘控制。 from functools import reduce def foo(a,n): l=[] while n>0: l.append(int(a*n)) n -= 1 sum=reduce(lambda x,y:x+y ,l) print(sum) a=input("Please input a's value: ") #2 n=int(input("Please a's counts :")) #3 foo(a,n)#输出结果: #246 2+22+222# 16 f = open("a") while 1: choice = input("是否显示:[Y/N]:") if choice.upper() == "Y": for i in f: print(i) else: break## 请问程序有无bug,怎么解决?#1、如果输入Y。输出文件内容。但每行都多一个换行符。再次输入Y则不会显示。#2、输入的不是Y也不是N,程序都会终止。#如果想要循环输出,则: f = open("a") while 1: choice = input("是否显示:[Y/N]:") if choice.upper() == "Y": for i in f: print(i.strip()) f.seek(0) elif choice.upper()=="N": break else: print("请输入正确的命令!")# 17 def foo(): print('hello foo') return () def bar(): print('hello bar')## (1)为这些基础函数加一个装饰器,执行对应函数内容后,将当前时间写入一个文件做一个日志记录。# (2)改成参数装饰器,即可以根据调用时传的参数决定是否记录时间,比如 @ logger(True)# 1、 import datetime def logger(fun): def wor(): with open("%s"%fun.__doc__,"a") as f: fun() a=str(datetime.datetime.now()) f.write(a+"\n") return wor @logger def foo(): "foo" print('hello foo') return () @logger def bar(): "bar" print('hello bar') foo() #生成foo文件,记录时间 bar() #生成bar文件,记录时间#2、 import datetime def logger(bool): def logger1(fun): def wor(): if bool: with open("%s"%fun.__doc__,"a") as f: fun() a=str(datetime.datetime.now()) f.write(a+"\n") return wor return logger1 @logger(True) def foo(): "foo" print('hello foo') return () @logger(False) def bar(): "bar" print('hello bar') foo() #生成foo文件,记录时间 bar() #不会生成bar文件# 18、三次登陆锁定:要求一个用户名密码输入密码错误次数超过三次锁定? used={} #可用用户名 error={} #用户名:输入错误次数(默认0)with open("used.txt") as f: for l in f.readlines(): l=l.split() used[l[0]]=l[1] for i in used: error[i]=0 flag=True flag1=True#先判断用户输入错误次数是否有达到3次的,有直接锁定用户并退出。#判断输入的用户是否在已锁定的用户中,有的话提示该用户已锁定。#输入的用户名和密码匹配正确,提示欢迎词。#输入的用户不存在提示重新输入。用户名正确,密码错误,error中对应用户的输入错误次数自加1,并提示重新输入! while flag: print(error) for i in error: if error[i] == 3: print("The name is disabled!") with open("black", "a") as f: f.write(i + "\n") flag = False flag1= False break if flag1: name = input("Please input your name : ") passwd = input("Please input your password : ") with open("black") as f: for i in f.readlines(): if name in i.strip(): print("The name is disabled!") flag1=False break if flag1: if name in used: if passwd == used[name]: print("Welcome %s !" % name) break else: print("Please input again !") error[name]+=1 else: print("Please input agin !") flag1=True
def shujuku(): with open("账号密码",mode='r',encoding='utf8') as f: lines = f.readlines() for i in lines: zm = i.strip() z,m = zm.split(":",2)[0],zm.split(":",2)[1] return z,mdef heimingdan(): with open('黑名单',mode='r',encoding='utf8') as f: lines = f.readlines() for i in lines: z1 = i.strip() return z1def suoding(userh): with open('黑名单', mode='a+', encoding='utf8') as f: f.write(userh)count = 0while True: user = input('账号:').strip() pwd = input('密码:').strip() z1 = heimingdan() if user == z1: print('该账号处于锁定状态,请联系管理员!') break z,m = shujuku() if user != z: print('用户名或密码错误,请重新输入!!') continue elif pwd != m: print('用户名或密码错误,请重新输入!!') count += 1 if count == 3: print('该账号错误次数过多,已被锁定,请联系管理员解锁!!') suoding(user) break else: continue else: print('欢迎登录!!') break