• 基础考试


    Python基础-月考

     

    1. 8<<2等于?

    1 # 32
    2 # 解释:将8按位左移2位
    3 # 8    0 0 0 0  1 0 0 0
    4 # 32  0 0 1 0  0 0 0 0

    2. 通过内置函数计算5除以2的余数

    1 print(divmod(5, 2)[1])
    2 
    3 #(2, 1)  2 = 5 // 2; 1 = 5 % 2

    3. s=[1,"h",2,"e",[1,2,3],"l",(4,5),"l",{1:"111"},"o"],将s中的5个字符提取出来并拼接成字符串

    1 s = [1, "h", 2, "e", [1, 2, 3], "l", (4, 5), "l", {1: "111"}, "o"]
    2 s_g = filter(lambda x: type(x) is str, s)   #由于int类型非可迭代对象,先使用filter过滤掉
    3 s_new = ''  #拼接字符串变量
    4 for i in s_g:
    5     s_new += i
    6 print(s_new)
    #方法2
    1
    s = [1, "h", 2, "e", [1, 2, 3], "l", (4, 5), "l", {1: "111"}, "o"] 2 3 print(''.join([i for i in s if type(i) == str]))

    4. 判断"yuan"是否在[123,(1,"yuan"),{"yuan":"handsome"},"yuanhao"],如何判断以及对应结果?

    1 l = [123, (1, "yuan"), {"yuan": "handsome"}, "yuanhao"]
    2 l_yuan = str(l)     #将列表转换为字符串
    3 if 'yuan' in l_yuan:
    4     print('True')
    #方法2 
    1
    l =[123, (1, "yuan"), {"yuan": "handsome"}, "yuanhao"] 2 def func(l): 3 if 'yuan' in l: 4 print(l) 5 for i in l: 6 if type(i) == tuple or type(i) == list: 7 func(i) 8 if type(i) == dict: 9 func(i.keys()) 10 func(i.values()) 11 12 func(l) 13 14 #运行结果 15 #(1, 'yuan') 16 #dict_keys(['yuan'])

    5. 执行结果并解释为什么?

    l=[1,2,3]

    l2=l.insert(3,"hello")

    print(l2)

    1 执行结果:None
    2 解释:‘.insert’方法的返回值为‘None’

    6. 计算结果以及为什么?

    a=[1,2,[3,"hello"],{"egon":"aigan"}]

    b=a[:]

    a[0]=5

    a[2][0]=666

    print(a)

    print(b)

     1 a = [1,2,[3,"hello"],{"egon":"aigan"}]
     2 b = a[:]    #列表b和列表a相同
     3 
     4 a[0] = 5    #将列表a中的第一个元素‘1’变为‘5’
     5 a[2][0] = 666   #将列表a中的第3个元素‘[3,"hello"]’(同样为列表)的第1个元素变为‘666’
     6 
     7 print(a)    #打印更改后的列表a
     8 print(b)    #打印列表b,就是列表a更改前的元素
     9 
    10 #执行结果:  [5, 2, [666, 'hello'], {'egon': 'aigan'}]
    11 #          [1, 2, [666, 'hello'], {'egon': 'aigan'}]

    7. 使用文件读取,找出文件中最长的行的长度(用一行代码解决)?

    1 print(max([len(x) for x in open('test.py', encoding='utf-8')]))    #bug:open文件的次数与for循环一致
    #方法2
    1
    f = open('test.py', encoding='utf-8') #假设文件已经打开 2 print(max([len(i) for i in f]))
    1 #方法3
    2 f = open('test.py', encoding='utf-8')
    3 
    4 from functools import reduce
    5 
    6 print(reduce(lambda a, b: a if a > b else b, (len(i) for i in f)))

    8. 分析结果

    def add(s, x):

       return s + x

    def generator():

       for i in range(4):

           yield i

    base = generator()

    for n in [1, 11]:

       base = (add(i, n) for i in base)

    print(list(base))

     1 #结果:[22, 23, 24 ,25]
     2 #解释:
     3 #这个可以以管道的思路来理解,首先generator()函数是第一个生成器,下一个是第一次循环的base = (add(i, n) for i in base),
     4 # 最后一个生成器是第二次循环的base = (add(i, n) for i in base)。 这样就相当于三个管道依次连接,但是水(数据)还没有流过,
     5 # 现在到了list(base),就相当于驱动器,打开了水的开关,这时候,按照管道的顺序,由第一个产生一个数据,yield 0,
     6 # 然后第一个管道关闭。 之后传递给第二个管道就是第一次循环,此时执行了add(0, 11),然后水继续流,
     7 # 到第二次循环,再执行add(11, 11),此时到管道尾巴了,第一个数据22就产生了。此时第一个管道再开放yield 1, 
     8 # 流程跟上面的一样。依次产生23,24,25; 直到没有数据。 把代码改一下容易理解:
     9 #由于在打开驱动器(list(base))之前,for循环已经走完了,循环体可以表示为:base = (add(i, n) for i in (add(i, n) for i in base)),所以,最终n=11
    10 def generator():
    11     for i in range(4):
    12         yield i     #第1个管道
    13 
    14 base = (add(i, n) for i in base)    #第2个管道
    15 base = (add(i, n) for i in base)    #第3个管道
    16 
    17 list(base)      #开关驱动器

    参考:python迭代器与生成器小结

    9. 如果用py2,py3下在cmd下运行会报错吗?为什么并提出解决方案? (编码)

    test.py (gbk方式保存):

    #coding:GBK

    print(“老男孩”)

     

    扩展,但是在python2.x解释器中,会显式乱码,python3.x下正常显式,是因为解释器自动帮我们解码了文件内容:

     

    10. 通过函数化编程实现5的阶乘

     1 def fn(n):
     2     x = 1
     3     if n == 0:    #0的阶乘为1
     4         x
     5     else:
     6         for i in range(1, n+1):
     7             x *= i
     8     return x
     9 
    10 print(fn(5))
    1 #方法2:递归
    2 def func(n):
    3     if n == 0 or n == 1:
    4         return 1
    5     return n * func(n-1)
    6 
    7 print(func(5))

    11. 打印如下图案:

              

         *

              ***

             *****

            *******

             *****

              ***

                *

     1 def print_star(n):    #n必须为奇数,此程序没有做判断
     2     s = '*'
     3     i = 1   #上部分,包含对称行
     4     j = n   #下部分
     5     while i < n and i % 2 != 0:
     6         print((s * i).center(n))
     7         i += 2
     8     while j > 0 and j % 2 != 0:
     9         print((s * j).center(n))
    10         j -= 2
    11 
    12 print_star(7)

    12

    def outer():
      count = 10
      def inner():
        count = 20
        print(count)
        return count
      inner()
      print(count)

    outer()

    (1). 分析运行结果?

     

    1 运行结果:20
    2         10
    3 分析:当调用函数outer时,按顺序读函数定义部分,outer函数内部嵌套定义了inner函数,
    4 读完inner函数的定义,首先调用了inner(),此时inner函数局部变量count为20,故先打印了20,然后打印了outer函数内部变量10

     

     

    (2).如何让两个打印都是20

     

     1 #方法1:将inner函数内部的count变量删除,将outer函数下的count变量赋值为20即可
     2 def outer():
     3     count = 20
     4     def inner():
     5         print(count)
     6         return count
     7     inner()
     8     print(count)
     9 
    10 outer()

     

    1 #方法2:将inner函数内部变量count = 20返回给外部函数outer的变量count
    2 def outer():
    3     def inner():
    4         count = 20
    5         print(count)
    6         return count
    7     count = inner()
    8     print(count)
    9 outer()

    13. 输入一个年份,判断是否是闰年?

     1 #闰年:四年一润,百年不润,四百年再润
     2 def leap_year(y):
     3     if y % 100 == 0:
     4         if y % 400 == 0:
     5             print('leap year')
     6         else:
     7             print('not leap year')
     8     elif y % 4 == 0:
     9         print('leap year')
    10     else:
    11         print('not leap year')
    12 
    13 leap_year(2000)
    1 #方法2
    2 judge = lambda year: True if (year % 4 == 0 and year % 100 != 0) or year % 400 == 0 else False
    3 print(judge(1900))

    14. 任意输入三个数,判断大小?

    1 def max_three(x, y, z):
    2     return max(max(x, y),z)
    3 
    4 print(max_three(1,2,3))

    15. 求s=a+aa+aaa+aaaa+aa...a的值,其中a是一个数字。例如2+22+222+2222+22222,几个数相加以及a的值由键盘控制。

    1 def sum_new(a, n):      #a代表求和的数字,n代表相加的次数
    2     sum = 0
    3     a = str(a)
    4     for i in range(1, n+1):
    5         x = int(a * i)
    6         sum += x
    7     return sum
    8 
    9 print(sum_new(2,3))

    16. 请问程序有无bug,怎么解决?

    1 f=open("a")
    2 while 1:
    3     choice=input("是否显示:[Y/N]:")
    4     if choice.upper()=="Y":
    5         for i in f:
    6             print(i)
    7     else:
    8         break
     1 #有bug,
     2 # 1,只要用户输入非‘y/Y’字符,程序都会结束,这与提示信息不符合
     3 # 2. ‘y/Y’只一次有效,如果用户想再次查看文件内容,必须得重启程序
     4 #解决方法:
     5 f = open("a")
     6 while 1:
     7     choice=input("是否显示:[Y/N]:")
     8     if choice.upper() == "Y":
     9         for i in f:
    10             print(i)
    11         f.seek(0)  #重置文件位置于文首
    12     elif choice.upper() == "N":  #严格要求用户必须输入‘n/N’方可退出程序
    13         break

    17.

    1 def foo():
    2     print('hello foo')
    3     return()
    4 def bar():
    5     print('hello bar')

    (1). 为这些基础函数加一个装饰器,执行对应函数内容后,将当前时间写入一个文件做一个日志记录。

     1 def timer(func):
     2     def wrapper():
     3         import time
     4         res = func()
     5         f = open('log', 'a+')   #以追加的方式打开文件,没有则会创建
     6         s = time.asctime()      #获取当前时间:Tue Apr 18 21:46:18 2017
     7         f.write(s + '
    ')       #将当前时间写入log文件,并换行
     8         f.close()               #关闭log文件
     9         return res
    10     return wrapper
    11 
    12 @timer
    13 def foo():
    14     print('hello foo')
    15     return ()
    16 @timer
    17 def bar():
    18     print('hello bar')
    19 
    20 foo()
    21 
    22 bar()

    (2). 改成参数装饰器,即可以根据调用时传的参数决定是否记录时间,比如@logger(True)

     1 def logger(choice):
     2     def timmer(func):
     3         def wrapper():
     4             import time
     5             if choice == True:
     6                 res = func()
     7                 f = open('log', 'a+')   #以追加的方式打开文件,没有则会创建
     8                 s = time.asctime()      #获取当前时间:Tue Apr 18 21:46:18 2017
     9                 f.write(s + '
    ')       #将当前时间写入log文件,并换行
    10                 f.close()               #关闭log文件
    11                 return res
    12             else:
    13                 pass
    14         return wrapper
    15     return timmer
    16 
    17 @logger(True)
    18 def foo():
    19     print('hello foo')
    20     return ()
    21 @logger(True)
    22 def bar():
    23     print('hello bar')
    24 
    25 foo()
    26 
    27 bar()

    18. 三次登陆锁定:要求一个用户名密码输入密码错误次数超过三次锁定?

     1 with open('account',encoding='utf8') as f_account, open('lockedlist', 'a+') as f_locked:
     2     l = []                  #定义用户名验证列表,存放黑名单数据
     3     f_locked.seek(0)        #"a+"模式打开后,文件位置位于末尾,要遍历文件内容,需要将指针移至文件起始位置
     4     for locked_info in f_locked.readlines():    #遍历黑名单
     5         l.append(locked_info.strip())                   #将黑名单数据添加进列表,注意:需要将文件中的换行符脱掉
     6 
     7     c = []                  #定义用户登录名列表,存储用户尝试的登录名
     8     count = 1               #登陆次数计数器
     9     flag = True             #登陆循环控制开关
    10     while flag and count < 4:
    11         user = input('Please input username:')      #输入用户名
    12         pwd = input('Please input password:')       #输入用户密码
    13         if user in l:                 #用户名在黑名单中
    14             print("This user is in blacklist,can't log in!")    #打印提示信息
    15             continue
    16         c.append(user)
    17         for info in f_account:                  #用户名不在黑名单中,遍历用户登陆文件
    18             user_name, user_pwd = info.strip().split(',')       #将文件中的用户名和登陆密码赋值给判定变量
    19             if user == user_name:               #用户名符合
    20                 if pwd == user_pwd:             #对应密码符合
    21                     print('Welcome %s' % user)  #打印登陆成功信息
    22                     flag = False               #登陆成功,跳出登陆程序
    23                     break
    24                 count += 1                      #对应密码不符合,while循环计数器加1
    25                 break
    26             count += 1                          #用户名不符合,while循环计数器加1
    27             break
    28     if count == 4:                              #如果不同用户名密码输错3次,关闭程序
    29         print('More than 3 times wrong!')       #打印提示信息
    30     if len(c) == 3 and c[0] == c[1] == c[2]:    #如果相同用户名密码输错3次,将该用户名加入黑名单,限制登陆
    31         print('This user has been locked!')
    32         f_locked.write(user+'
    ')               #将错误3次的用户名写入黑名单,注意,加换行符
     
     
  • 相关阅读:
    排序算法的体验游戏
    【转】[Java] HashMap使用的示例
    【转】【Android】使用BaseAdapter实现复杂的ListView
    【转】Java 集合系列03之 ArrayList详细介绍(源码解析)和使用示例
    【转】Java集合框架List,Map,Set等全面介绍
    【转】java参数传递(超经典)
    bluetooth记录
    【转】Java 字符串常用操作(String类)
    【转】Java中字符串中子串的查找共有四种方法(indexof())
    【转】BLE 学习记录
  • 原文地址:https://www.cnblogs.com/zcok168/p/10058050.html
Copyright © 2020-2023  润新知