python学习笔记11 第1次测试考题答案及知识点

10题
l1=[1,2,3,4,5,6,7,8,9,0]
print(l1[1:4])
l1[1:4]='abcd'
print(l1)

输出结果,赋值时并没有出现顾头不顾尾的情况?

[2, 3, 4]
[1, 'a', 'b', 'c', 'd', 5, 6, 7, 8, 9, 0]

一.判断题

正确说法

1 字典的键是唯一的 

2 字典通过pop删除键值对

3 给一个列表extend('ab3'),实际上是添加了a,b,3三个字符串

4 for循环汇总可以使用continue

5 a = ('alex') a为字符串类型

(a=('alex',)) 则a类型为元组)

6 l1=[1,2,3] l2 = l1 l1.append(666) print(12)结果为[1,2,3,      666]  

(

直接赋值:其实就是对象的引用(别名)。

2、传递规则

Python 赋值过程中不明确区分拷贝和引用,一般对静态变量的传递为拷贝,对动态变量的传递为引用。(注,对静态变量首次传递时也是引用,当需要修改静态变量时,因为静态变量不能改变,所以需要生成一个新的空间存储数据)。

  • 字符串,数值,元组均为静态变量
  • 列表,字典为动态变量。

https://www.runoob.com/w3cnote/python-variable-references-and-copies.html

)

7 l1 = [22,33,44] l2 =l1[:] l1与l2的关系为浅copy 

(copy() 函数用于复制列表,类似于 a[:])

8 len可以计算字典中键值对的个数

(Python 字典(Dictionary) len() 函数计算字典元素个数,即键的总数。)

9 python 中的名称空间分为:内置名称空间,全局名称空间,局部名称空间

10 在函数中如果想改变一个全局变量,可以通过global实现

 

错误说法

1 集合里面的元素必须是可变的数据类型

(必须是不可变的)

2 [存疑] 元组为只读列表,只能进行增和查

(1 元组中的元素值是不允许修改的,但我们可以对元组进行连接组合, 2 元组中的元素值是不允许删除的,但我们可以使用del语句来删除整个元组)

3 在python3版本中,字典中的keys()方式是将字典的所有键都存放至一个列表中

(他像一个列表,但不是列表,[Python3 字典 keys() 方法返回一个可迭代对象,可以使用 list() 来转换为列表。

注意:Python2.x 是直接返回列表])

4 s1='alex@' s2='alex@', s1 与 s2 公用一个内存地址.

(在cmd中运行可知不是,因为含有特殊字符@,不会被列入小数据池中)

5 集合是无序的不重复的,里面的元素要求是不可哈希的

(里面的元素要求是可哈希的,不可变的, 集合(set)是一个无序的不重复元素序列。)

6 is比较的仅仅是数值是否相同

(is比较的是内存地址, == 比较的是数值)

7 在循环一个字典时给字典添加一个键值对会报错

(在循环字典时不能改变他的大小,添加键值对等于修改了字典大小)

8 idc= { }  dic.fromkeys('abc',666) 最终dic为{'a':666,'b':666,'c':666}.

(Python 字典 fromkeys() 函数用于创建一个新字典,以序列 seq 中元素做字典的键,value 为字典所有键对应的初始值。但想使用此新字典需要将返回值赋给对应的变量,这个方法本身不会对dic产生影响)

9 在文件操作中,r+模式只能读写,不能写读.

(r+ 可以先写后读,也能先读后写)

10 函数的默认返回值是: False

(函数的默认返回值是None)

 

二 填空题

 

2 获取list的元素个数和向末尾追加元素所用的方法是len() 和 append()

6 删除字典的键值对两种方式_pop()_,_popitems()_, del

7 列举:字符串,元组,字典,数字,其对应bool值为False的值为_""_    _(,)_    _tuple()_   _{}_   _0_

 

三简答题

1 is和==的区别

is比较的是内存地址,==比较的是数值

2 函数中*args  **kwargs 是什么意思

*args 是位置参数的动态参数

**kwargs 是关键字的动态参数

3 list 和tuple 有什么不同

list可以修改,tuple不能修改

4 解释一下, 位, 字节, 字符.

位: 计算机最底层最小的数据单位, 一个0或者1

字节: 1字节=8位,由ASCII码来的

字符: 能被看到的一个单一的文字符号

5 python中什么数据类型存在小数据池?小数据池有什么作用?

int 和  适用对象: int(float),str,bool 

作用是节省内存,快速处理对应数据

6 在python3x八本中,s1='老男孩',如何将s1转化成utf-8的bytes类型?转化成功之后,得到了s2,如何将s2转化成gbk的bytes类型(请写出具体代码)?

用编码 encode 进行转化 s1.encode(encoding='utf-8')

[存疑] s2转化成gbk,先解码为unicode,再编码为gbk  s2.decode('unicode').encode('gbk')

手动转码规则

        UTF-8 --> decode 解码 --> Unicode

        Unicode --> encode 编码 --> GBK / UTF-8 等

7 将列表去重

直接使用set( ) 的去重特性即可

8 '1,2,3' 如何变成['1','2','3']?

s1 = '1,2,3'
print(s1.split(','))

['1','2','3']如何变成[1,2,3]?

s1 = '1,2,3'
s2 = s1.split(',')
n = 0
for i in s2:
    s2[n] = int(i)
    n += 1
print(s2)

9  lis =[['k',['qwe',{'k1':['tt',3,'1']},89],'ab']]

1) 将列表list中的'tt' 变成大写

lis[0][1][1]['k1'][0]=lis[0][1][1]['k1'])[0].upper()

2)将列表中的3通过数字相加再转换成字符串的方式变成'100'

lis[0][1][1]['k1'][1] = str(lis[0][1][1]['k1'][1]+97)

3)将列表中的字符串'1' 通过字符串的拼接的方式变成'101'

lis[0][1][1]['k1'][2] = lis[0][1][1]['k1'][2] + '01'

10  dic = {'k1':'v1','k2':['alex','sb'],(1,2,3):{'k3':['2',100,'wer']}}

1) 将'k2' 对应的值的最后面添加一个元素'23'

dic['k2'].append('23')

2) 将'k2' 对应的值的第一个位置插入一个元素'a'

dic['k2'].insert(0,'a')

3)将(1,2,3)对应的值添加一个键值对'k4':'v4'

dic[(1,2,3)].setdefault('k4','v4')

11 使用 range 打印 100,99,98,......1,0

for i in range(100,-1,-1):
    print(i)

12 下面代码有没有问题?如果有问题请指出来

f = open('a.txt',encoding='utf-8')

f.write('666')

open() 函数默认mode=r,此处为写入操作,所以要重新设置mode=w,w+,r+ 均可

四 编程题

1 将字符串"k:1|k1:2|k2:3|k3:4" 处理成字典 {'k': 1, 'k1': 2, 'k2': 3, 'k3': 4} 

s1 = 'k:1|k1:2|k2:3|k3:4'
print(s1.split('|'))
s2 = s1.split('|')
li1 = []
dic1 = {}
for i in s2:
    li1 = i.split(':')
    dic1[li1[0]] = int(li1[1])
print(dic1)

 

2 实现一个整数加法计算器,如:content = input('请输入内容:') #如用户输入:5+8+7.....(最少输入两个数相加),将最后的计算结果添加到此字典中(替换None): dic{'最终计算结果':None}

s1 = input("请输入内容:")
sum = 0
dic = {'最终计算结果': None}
for i in s1.split("+"):
    sum = sum+int(i)
dic["最终计算结果"] = sum
print(dic)

 

3 写函数,函数可接受多个字符串类型的参数.此函数的功能是将所有的参数以'_'的形式隔开,然后追加到一个文件中.

def main(file_path, *args):

        ....

def main(file_path, *args):
    print(args)
    l1 = '_'.join(args)
    f = open(file_path,mode='a',encoding='utf-8')
    f.write(l1)
    f.flush()
    f.close()

打开文件常规写法1: f = open(file_path,mode='a',encoding='utf-8')

 

4 给函数传入一个列表(此列表里面的元素必须全部是str类型),将列表汇总的每个元素按照顺序依次加上他们的索引,形成新的元素,并添加到一个新列表,将列表返回.

例如: 给函数传入一个列表['alex','太白'], 返回值为['alex0','太白1']

def main(list1):
    list2 = []
    for i in list1:
        list2.append(i+str(list1.index(i)))
    return list2

以上为瑕疵写法,因为list1.index(i)的作用是在list1中找出跟i匹配的第一个元素并返回其索引值.当引入列表中有相同元素时,此函数输出结果会出错

def func(lst):
    new_lst = []
    for i in range(len(lst)):
        new_lst.append(lst[i]+str(i))
    return new_lst

以上为正确写法,获取列表索引的常用写法为 for i in range(len(lst)),通过range() 函数计数列表长度来获取对应的列表索引.

 

5  

# 1,alex,22,13651054608,IT
# 2,wusir,23,13304320533,Teacher
# 3,taibai,18,13332353221,IT
# 利用文件操作,将其构造成如下数据类型
# [{'id':'1','name':'alex','age':'22','phone':'13651054608','job':'IT'},......]

我的写法(此写法idc1={}放在for循环外会导致最终结果错误,因为每次for循环没有对dic1进行初始化)

f = open("t1.txt", mode='r',encoding='utf-8')
list1 = []
dic1 ={}
n = 1
for i in range(3):
    content = f.readline().split(',')
    dic1['id'] = content[0]
    dic1['name'] =content[1]
    dic1['age'] = content[2]
    dic1['phone'] = content[3]
    dic1['job'] = content[4]
    list1.append(dic1)
    n = n+1
print(list1)
f.close()

 

参考答案

result = []
with open('t1.txt',encoding='utf-8') as f:
    #读取每一行数据
    for line in f: 
        dic = {}
        lst = line.strip().split(',')
        dic['id'] = lst[0]
        dic['name'] = lst[1]
        dic['age'] = lst[2]
        dic['phone'] = lst[3]
        dic['job'] = lst[4]
        result.append(dic)
print(result)

要点:循环中使用的数据,最好在循环中初始化,否则可能出现意想不到的bug.即要让变量的作用域尽可能小

# 有如下值li=[11,22,33,44,55,77,88,99,90],将所有大于66的值保存至字典的第一个key中,
# 将小于66的值保存至第二个key的值中(在原有代码基础上补充,不得改变原有代码.)
li = [11,22,33,44,55,77,88,99,90]
result = {}
for row in li:
    if row > 66:
        result.setdefault('k1',[]).append(row)
    else:
        result.setdefault('k2',[]).append(row)
print(result)

本题主要在于setdefault()的使用,可以在不在循环外初始化变量的前提下新建list并存储数据,不会因为循环的问题让数据被反复清零.#如果在没有初始化list的情况下在循环内完成list数据存储#

# 写函数,完成以下功能
# 例如有:
#     user_list = [
#         {"name":"alex","hobby":"抽烟"},
#         {"name":"alex","hobby":"喝酒"},
#         {"name": "alex", "hobby": "烫头"},
#         {"name": "wusir", "hobby": "喊麦"},
#         {"name": "wusir", "hobby": "街舞"},
#     ]
# 编写函数处理user_list并返回如下结果:
# [
#     {"name":"alex","hobby_list":["抽烟","喝酒","烫头",]},
#     {"name":"wusir","hobby_list":["喊麦","街舞"]}
# ]
# 注意:
# 1. user_list中元素格式固定,即:{"name":"值","hobby":"值"}
# 2. user_list中元素的个数是动态的,即: user_list也可以是:
# [
#     {"name":"alex","hobby":"抽烟"},
#     {"name": "alex", "hobby": "烫头"},
#     {"name": "wusir", "hobby": "街舞"},
#     {"name": "太白", "hobby": "开车"},
# ]

一个比较笨拙的写法,必须先预设好一部分result数组内容才能运行,核心方法是两层for循环:先拿user_list里的一个字典元素去跟result里的字典元素一个一个比对,比对得上则将hobby加入hobby_list,全部比对不上则新增为一个字典元素,然后再用user_list里的下一个字典元素试,以此类推.达到双向遍历的效果.

user_list = [
    {"name": "alex", "hobby": "抽烟"},
    {"name": "alex", "hobby": "喝酒"},
    {"name": "alex", "hobby": "烫头"},
    {"name": "wusir", "hobby": "喊麦"},
    {"name": "wusir", "hobby": "街舞"},
]

def main(user_list):
    result = [{"name":"alex","hobby_list":[]},{"name":"wusir","hobby_list":[]}]
    for data1 in user_list:
        n = 0
        for data2 in result:
            if data1['name'] == data2['name']:
                data2['hobby_list'].append(data1['hobby'])
            else:
                n += 1
        if n == len(result):
            result.append({'name':data1['name'],'hobby_list':data1['hobby']})
    return result

print(main(user_list))

 

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章