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.即要让变量的作用域尽可能小
6
# 有如下值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数据存储#
7
# 写函数,完成以下功能
# 例如有:
# 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))