程序员

2021年最新合适学Python小白练习的24道题和答案解析《不看后悔,

作者:admin 2021-06-17 我要评论

?参考答案在末尾 下面关于pycharm描述错误的是() A . pycharm用于我们开发python程序的集成工具 B. pycharm不可以打开已有的项目代码 C. 使用pycharm运行代码需...

在说正事之前,我要推荐一个福利:你还在原价购买阿里云、腾讯云、华为云服务器吗?那太亏啦!来这里,新购、升级、续费都打折,能够为您省60%的钱呢!2核4G企业级云服务器低至69元/年,点击进去看看吧>>>)

<?参考答案在末尾>

  1. 下面关于pycharm描述错误的是()

    • A . pycharm用于我们开发python程序的集成工具
    • B. pycharm不可以打开已有的项目代码
    • C. 使用pycharm运行代码需要设置python解释器
    • D. pycharm可以打开已有的项目代码,运行前需要设置解释器

    解析:pycharm 可以创建新的项目,在创建的时候让我们选择解释器,同样也可以打开已有的项目,但是打开后需要我们再配置下解释器,否则不能运行

  2. 下面python中变量命名不正确的是()

    • A. Person
    • B. Name10
    • C. __name
    • D.66name

    解析:python中变量命名是由数字字符下滑线构成,但是不能以数字开头

  3. 下面关于python中的注释错误的是()

    • A. #注释
    • B. ‘’‘注释’‘’
    • C. “”“注释”“”
    • // 注释
  4. 下面关于python中的字符串格式化错误的是()

    • A. "{}".format(10)
    • B. print("%d" % 10)
    • C. f'{10}'
    • D. print("%d",10,20)

    D是普通的打印,其他是python3中不同的格式化方式

  5. 对于name = input("请输入姓名:") 理解错误的是(A)

    • name 是int类型
    • input参数中的字符串是提示字符
    • input返回的是字符串
    • input用于接收用户从键盘的输入信息

    input 返回的都是字符串类型,如果想转其他类型使用对应的转化方法

  6. 下面那些运算后返回的不是bool值()

    • A. 10 + 20
    • B. 10>20
    • C. 10==20
    • D. 10<20 and 30 == 30

    python 中比较运算符 逻辑运算符 返回的都是bool类型

  7. 下面那一个不可以正确打印ok()

    • A. if 1:print('ok')
    • B. if -1: print('ok')
    • C. if 0: print('ok')
    • D. if [1]:print('ok')

    python中的非0数字可以表示True,容器类型的数据如果有数据也可以表示True

  8. 下面的代码可以达到预期效果(错误)

    # 根据用户输入,判断年龄是属于小孩(10岁以下),青年(10~20岁),还是中年,或者老年
    age = int(input("请输入年龄: "))
    if age<=20:
        print("青年")
    if age<10:
        print("小孩")
    if age=>20 and age <=50:
        print("中年人")
    if age>50:
        priint("老年人")

    错误 不能完成,因为当年龄小于10岁的时候代码不会执行

  9. 下面random【百度查询】随机1~10之间的浮点数正确的是()

    • A. random.random()
    • B. random.randint(1,10)
    • C. random.random()+1
    • D. random.random()+random.randint(1,9)

    random.randint 用于生成范围整数,

    random.random()用于生成0~1 直接的浮点数

    如果想生成1~10直接的浮点数

    可以先生成1~9的整数 然后再加上0~1 的浮点数,所以答案是D

?

  1. 请分析下面的代码是否可以实现预期的目的?这块程序的运行结果是什么? 如果不能实现请修改代码实现目的要求

 ? 
# 目的: 当x*y = 64的时候退出循环
   x = 1
   while x<10:
       y = 1
       while y<10:
           if x*y == 64:
               continue
           y+=1
       x+=1
   print(x,y)
 ?
 # 解析
   #1. 不能实现
   #2. 这个代码会死循环【在内循环里面】,导致程序无休止运行,而不能打印任何内容
   #3. 修改代码,首先需要把coninue 改成break,内循环break后仅仅跳出内循环已经不能跳出外循环,所以需要添加一个标志
   x = 1
   # 用于控制跳出外循环的标志
   flag = False
   while x<10:
       y = 1
       while y<10:
           if x*y == 64:
               # 修改标志可以跳出外循环了
               flag = True
               #continue,修改成break完成内循环跳出
               break
           y+=1
       # 检查表示是否可以跳出外循环
       if flag:
           break
       x+=1
   print(x,y)
   

11.分析修改下面的代码不能达到预期结果的原因,如果不能把分析的原因说明,然后修改代码【要求2种方式实现 一种是在现在代码基础上,一个是使用for in】

#要求: 现有一个列表 li = [1,2,3,4,6,7,8,10,12],删除列表中的偶数数据
li = [1,2,3,4,6,7,8,10,12]
index = 0
length = len(li)
while index < lg:
    if li[index]%2==0:
        del li[index]
    index+=1
print(li)
# 答案剖析
#1. 不能实现里面存在不少问题
    #1.1 当删除元素的时候,我们的列表长度会减少 while 判断标准是最初的长度,最后会越界错误,修正实时与li长度比较 while index<len(li)
    #1.2 在上面的基础上运行仍然会报越界错误, 删除元素后,我们的下标不应该再移动了
# 2. while 版本的修正
li = [1,2,3,4,6,7,8,10,12]
index = 0
# 因为要删除元素所以要实时与li的长度比较
while index < len(li):
    if li[index]%2==0:
        # 删除元素后,列表后面的元素会向前移动,所以index下标不应该再移动
        del li[index]
        continue
    index+=1
print(li)
?
# #for in 版本1
li = [1,2,3,4,6,7,8,10,12]
tmp=[]
?
while True:
    # 用于标志列表中没有偶数元素了
    flag = True
    # 下面的删除会漏删除,所以多次循环删除,保证所有的偶数都被删除
    for num in li:
        if num%2==0:
            li.remove(num)
            # 删除说明列表有偶数元素
            flag = False
    # 循环结束后,flag没有变化说明,里面全是奇数了,可以break 出来了
    if flag:
        break
        
 #for in 版本2
li = [1,2,3,4,6,7,8,10,12]
# 临时列表用于记录要删除的元素
tmp=[]
# 循环记录要删除的元素
for num in li:
    if num % 2==0:
        tmp.append(num)
# 循环删除要删除的元素
for num in tmp:
    li.remove(num)
?

?

12.下面代码可以正常运行()

dic = {"name":"mrsun",'age':20}
print(dic['money'])

获取不存在的键会发生异常, 可以使用 dic.get('money') 来获取键,不存在则返回None

?

  1. 下面代码运行后的输出结果(D)

    money = 100
    age = 30
    user = {"name":'mrsun','age':18,'money':0}
    def modify(user,age,money):
        user['age'] = age
        user['money'] = money
        age = 100
        money = 1000000
    modify(user,age,money)
    print(money,age,user)

    函数内部仅仅会修改字典user的值,字典是引用类型,所以可以修改其他不可以修改

    • A. 100, 30, {'name': 'mrsun', 'age': 30, 'money': 0}
    • B. 100000, 100, {'name': 'mrsun', 'age': 30, 'money': 0}
    • C. 100000, 100, {'name': 'mrsun', 'age': 30, 'money': 100}
    • D. 100,30, {'name': 'mrsun', 'age': 30, 'money': 100}
  2. 请按照下面的要求完成代码编写

    【难度有一些请同学们做好准备】假如现有一组爬虫爬取的数据,每个元素包含了一个IP地址域端口号,[("192.168.1.109",6000),("192.168.1.109",None),("192.168.2.255",8000),("192.168.100.200",8080),("192.168.1.8600",6000),("192.168.1.199",8000),("192.168.1.500",6000),("192.168.1.50",80000),("192.168.1.50",'80000')],里面的部分数据有错误,

    编写代码中可以考虑使用列表推导式

    提示:

    1. ip地址192.168.1.205 由点号分割的4个整数范围是0~255,端口是大于1~65535的数字

    2. 可以借助函数方法、灵活使用列表推导式、字符串操作、逻辑运算 等

    要求: 请同学们,列表推导式以外不要使用循环

    # 答案解析
    #遍历IP和端口满足要求则是我们需要的
    li =  [("192.168.1.109",6000),("192.168.1.109",None),("192.168.2.255",8000),("192.168.100.200",8080),("192.168.1.8600",6000),("192.168.1.199",8000),("192.168.1.500",6000),("192.168.1.50",80000),("192.168.1.50",'80000')]
                                                                                       # 检查IP是否满足标准
    def ipok(ip):
        # 分割IP地址,获取数字列表
        ipli = ip.split('.')
        print(ipli)
        # 列表推导式,如果不符合对应字段设置False
        tmp = [True if 0<int(num)<=255 else False for num in ipli ]
        # 判断False与没有在里面,如果再里面说明Ip有问题
        return not False in tmp
    ?
    # 检查端口是否满足规则
    def portok(port):
        # 端口不能为None 且是整数,范围在0~65535直接
        return port is not None and isinstance(port,int) and 0<port<65535
        
    # 提取没有问题的ip 与端口
    hli = [item for item in li if ipok(item[0]) and portok(item[1])]
    print(hli)    
                                                                                       
    # ========================我是华丽的分割线===============================
    #  终极合并版本
    hli = [item for item in li if (not False in [True if 0<int(num)<=255 else False for num in item[0].split('.') ]) and (item[1] is not None and isinstance(item[1],int) and 0<item[1]<65535)]
    print(hli)

    ?

16.下面关于函数错误错误的(A)

答案解析:

A . 定义函数的时候如果有默认缺省参数值的时候,应该从参数的右边向左,所以此选项错误

B. 函数的作用就是提高我们的代码复用

C 的函数定义方式包含了 形参,缺省参数,可变参数,关键词参数 定义ok

D. Func(*arg)是函数参数解包,等价于 Func(1,2,3,4,5) 所以函数调用ok

  • def Fun(a = 100,b,c = 50): pass
  • 函数的作用就是提高代码复用
  • def Func(a,b,c=None,*args,**kwargs):pass
  • 假如有一个arg = (1,2,3,4,5)元组, 按照Func定义方式去调用 Func(*arg)

17.关于下面代码运行print的值是()

li = [1,2,3]
def Modify(li):
    li.append(4)
    print(li)
print(li)
Modify(li)
fn = Modify
print(fn)
fn(li)
print(li)
print(fn(li))

?

?

# 答案解析
li = [1,2,3]
# 函数定义
def Modify(li):
    # 向li中追加元素4,li 是应用类型所以函数内部修改会影响外面的数据
    li.append(4)
    print(li)
# 没有做任何修改所以原始数据[1,2,3]
print(li)
# 函数调用,函数内部打印修改后的li  [1,2,3,4]
Modify(li)
# 函数也可以赋值给变量,那么这个变量也是函数
fn = Modify
# 打印函数,所以是:<function Modify at 0x0000014208F986A8> 这样的格式
print(fn)
# 函数调用,再次增加一个元素4是:[1,2,3,4,4]
fn(li)
# 打印li 依旧是:[1,2,3,4,4]
print(li)
# 函数调用,函数内部追加4,打印:[1,2,3,4,4,4], print 打印函数的返回值,因为函数没有返回值所以是None
print(fn(li))

?

18.下面代码运行结果下面描述真正的()

f = open("1.txt",'w')
f.write("welcome to python!")
f.close()

f = open("1.txt",'w')
f.write("python is best language!")
f.close()
f = open("1.txt",'r')
# 第一次打印
print(f.read())
f.close()

f = open("1.txt",'w')
f.close()
f = open("1.txt",'r')
print(f.read())
f.close()
  • A. 第一次打印内容是 : welcome to python!python is best language!
  • B. 第二次打印内容是 : welcome to python!python is best language!
  • C. 第一次打印内容是:welcome to python!
  • D. 第二次打印内容是: 空字符

解析:

本题考查的内容是 打开文件的w 模式

w模式,如果文件不存在则创建文件,如果文件存在则清空文件内容

第一次打印的内容应该是:python is best language!

第二次打印内容是:“” 也就是空字符

?

19.请同学实现一个可以递归删除指定目录下面的固定格式的文件的程序()

示例: remove(myproject,'pyc') , 表示删除myproject目录中的所有以pyc文件结尾的文件

# 答案解析,以删除txt文件为例
import os
import sys

# remove 出指定目录下面的指定后对文件,支持嵌套目录中的删除
def remove(rdir,suffix):
    if not os.path.isdir(rdir):
        print("目录不存在,请核对!")
        
    #1. 获取当前目录下面的所有文件夹以及文件
    files = os.listdir(rdir)
    # 记录当前的路径,也就是ridr路径,需要拼接完整路径
    pwd = rdir
    #2. 遍历所有文件,检查是否是以suffix结尾的文件,如果是执行删除
    for tmp in files:
        # 判断当前的是文件还是目录
        # 拼接完成路径
        obpath = os.path.join(pwd,tmp)
        
        if os.path.isfile(obpath):
            #3. 判断文件是否是以suffix 结尾的文件
            if obpath.endswith(suffix):
                # 如果是则说明是我们要删除的文件
                os.remove(obpath)
        else:
            #4. 如果是目录则递归调用删除
            print(obpath)
            remove(obpath,suffix)
    

if __name__ == "__main__":
    remove("mytest",".txt")

20.对于下面代码运行结果不正确的是()

class ObjSet(object):
    gattr = "init"
    def __init__(self, attr):
        self.attr = attr
    @classmethod
    def setg(cls,gattr):
        cls.gattr = gattr
    def tryGattr(self,gattr):
        self.gattr = gattr

obj = ObjSet(10)
# 第一次打印
print(obj.gattr,ObjSet.gattr)
obj.tryGattr("python")
# 第二次打印
print(obj.gattr,ObjSet.gattr)
obj.setg("golang")
# 第三次打印
print(obj.gattr,ObjSet.gattr)
  • A. 第一次打印结果 init init
  • B. 第二次打印结果 python python
  • C. 第二次打印结果 python init
  • D. 第三次打印结果 python golang
# 答案解析
# 这里面主要弄清类方法与对象方法的区别与作用
# 类方法主要用于修改类属性,对象方法主要用于修改对象属性
class ObjSet(object):
    # 类属性
    gattr = "init"
    def __init__(self, attr):
        # 对象属性
        self.attr = attr
    @classmethod
    def setg(cls,gattr):
        # 通过类方法设置类属性
        cls.gattr = gattr
    def tryGattr(self,gattr):
        # 没有gattr属性所以默认使用了类属性
        print(self.gattr)
        # 设置对象属性
        self.gattr = gattr

obj = ObjSet(10)
# 第一次打印,因为没有对象属性所以打印的都是 类属性,所以都是 init init
print(obj.gattr,ObjSet.gattr)

# 设置了对象属性
obj.tryGattr("python")
# 第二次打印,因为方法中设置了与类属性同名的对象属性,对象属性变化,类属性没有变化,所以打印结果:python init
print(obj.gattr,ObjSet.gattr)

# 设置类属性
obj.setg("golang")
# 第三次打印,类属性更改,所以再第二次打印的基础上变化: python golang
print(obj.gattr,ObjSet.gattr)

?

21.下面的描述错误的是()

  • A. 对于所有实例对象都有的属性且属性值都一样的属性可以设置为类属性
  • B. 对于所有对象都有的属性,且每个对象的属性值可能不同,可以设置为对象属性
  • C. 我们可以在对象(实例)方法中修改类属性
  • D. a, b 是同一个类的实例化的对象,a对象中修改了类属性,在b对象中类属性没有发生变化

?

# 答案解析
A,B定义类属性以及对象属性的场景
C 类属性主要是通过类方法修改,但是也可以在对象属性中通过类名字加属性访问修改,但是不建议,假如某一天修改类名字的时候,方法中所有获取或者修改类属性的地方都要修改,不利于扩展,所以不推荐
D. 类属性是所有的对象共享的属性,所以a对象中更改后b对象中同样看到的是更改后的值,所有D选项是错误的

22.请修改下面的代码使其运行正确

class Master1(object):
    def __init__(self):
        super().__init__()
        self.a = 100
        
        
class Master2(object):
    def __init__(self):
        self.b = 200
       
class Sub(Master1,Master2):
    def __init__(self):
        pass
        
    def show(self):
        print(self.a,self.b)

sub = Sub()
sub.show()
# 答案解析
# 这个题目考察super的作用以及多继承的查找
# 1. 初次运行提示我们没有a属性,因为a属性,是父类初始化中,初始化的,在Sub中并没有调用super进行父类初始化,所以在super().__init__() 进行父类初始化
# 2. 此时再运行 提示没有b属性, 当我们查找b属性的时候,发现sub中没有,继续向父类Master1中查找发现没有,继续Master2中查找依旧没有,因为Master2的初始化没有进行,Master1的初始化中添加super便于进行后续父类的初始化

class Master1(object):
    def __init__(self):
        self.a = 100
        # 用于初始化Master2,获取b属性
        super().__init__()
        
        
class Master2(object):
    def __init__(self):
        self.b = 200
       
class Sub(Master1,Master2):
    def __init__(self):
        # 用于初始化Master1,获取a属性
        super().__init__()
        
    def show(self):
        print(self.a,self.b)

sub = Sub()
sub.show()

23.下面的代码是否可以运行,不能运行请指出其原因

# a.py
from b import age
name = "MrSun"
print(name,age)

# b.py 
from a import name
age = 20
print(name,age)

# 运行其中任何一个文件

# 答案解析
# 不能运行,a模块与b模块出现了循环导包

24.【此题有不小的难度4个星,请同学做好心理准备】

题目:现在有2个类,一个是博主类一个是粉丝类,要求博主可以发表博客,博主提供查看博客的内容,博主可以提供粉丝关注功能,博主提供粉丝取消关注的功能,当博主更新状态的时候,粉丝可以得知博主的状态更新了!提供博客的评论功能,便于当新博客更新后,粉丝评论

要求:

  1. 同学们百度关键词 python 观察者模式,查阅观察者模式相关的资料

  2. 同学们请使用观察者模式实现此案例

  3. 里面提供了2个类,其他的类需要同学自己抽取,方法也需要同学分析!

  4. 请同学们灵活使用基础所学内容

  5. 把关注博主的粉丝信息保存到文件中fans.info,以及博主发表的博客内容,博客对应的评论内容保存到 blogs.info

    1. fans.info 格式 : ['粉丝: 粉丝1', '粉丝: 粉丝2']

    2. blogs.info 格式:

[{id:1,content:xxx,comments:[conment1,comment2]},xxx]  # 可以考虑使用推导式

提醒: 实际开发也是这样的一个状态,可能是边查看资料边写代码,提前感受下!

参考答案:

题目比较开放可以基本实现即可

?

参考答案放链接尝试无法打开 文本分享+官方写作口口交流裙:924403856

;原文链接:https://blog.csdn.net/ChengYin1124/article/details/115625194

版权声明:本文转载自网络,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。本站转载出于传播更多优秀技术知识之目的,如有侵权请联系QQ/微信:153890879删除

相关文章
  • 阿里巴巴DevOps实践指南(八)| 以特性

    阿里巴巴DevOps实践指南(八)| 以特性

  • 阿里巴巴DevOps实践指南(五)| 业务驱

    阿里巴巴DevOps实践指南(五)| 业务驱

  • RISC-V工具链简介

    RISC-V工具链简介

  • 变局时代:RISC-V处理器架构的技术演变

    变局时代:RISC-V处理器架构的技术演变

腾讯云代理商
海外云服务器