1. 请写出 “路飞学城alex” 分别用 utf-8 和 gbk 编码所占的位数
“路飞学城alex” utf8占16位字节,gbk 占12位字节。

2. python有哪几种数据类型,分别什么?哪些数据类型是有序的。
python有:字符串、列表、元组、集合、字典、布尔 六种类型 。 其中字典是无序的。集合中有字典就是无序集合。

 3. 列表和字典的pop方法有什么区别。
列表pop不指定参数就是删除最后一个元素,参数有索引就删除索引对应的元素。
字典pop需要指定参数key。 
 
   1. read,readline,readlines的区别。

read        读取整个文件

readline    读取下一行

readlines   读取整个文件到一个迭代器以供我们遍历(读取到一个list中,以供使用,比较方便)、


2. 执行f.write()之后,会立刻写入磁盘吗?不会的话,有几种方式能让其写入磁盘中?

当我们写文件时,操作系统往往不会立刻把数据写入磁盘,而是放到内存缓存起来,空闲的时候再慢慢写入。只有调用close()方法时,

操作系统才保证把没有写入的数据全部写入磁盘。忘记调用close()的后果是数据可能只写了一部分到磁盘,剩下的丢失了。所以,

还是用with语句来得保险:  

with open('/Users/michael/test.txt', 'w') as f: 

  • f.write('Hello, world!')
     


3. 简述内置函数globals() locals()的作用 (口述)
Python两个内置函数——locals 和globals


这两个函数主要提供,基于字典的访问局部和全局变量的方式。
在理解这两个函数时,首先来理解一下python中的名字空间概念。Python使用叫做名字空间的
东西来记录变量的轨迹。名字空间只是一个字典,它的键字就是变量名,字典的值就是那些变
量的值。实际上,名字空间可以象Python的字典一样进行访问


每个函数都有着自已的名字空间,叫做局部名字空间,它记录了函数的变量,包括函数的参数
和局部定义的变量。每个模块拥有它自已的名字空间,叫做全局名字空间,它记录了模块的变
量,包括函数、类、其它导入的模块、模块级的变量和常量。还有就是内置名字空间,任何模
块均可访问它,它存放着内置的函数和异常。


当一行代码要使用变量 x 的值时,Python会到所有可用的名字空间去查找变量,按照如下顺序:


1.局部名字空间 - 特指当前函数或类的方法。如果函数定义了一个局部变量 x,Python将使用
  这个变量,然后停止搜索。
2.全局名字空间 - 特指当前的模块。如果模块定义了一个名为 x 的变量,函数或类,Python
  将使用这个变量然后停止搜索。
3.内置名字空间 - 对每个模块都是全局的。作为最后的尝试,Python将假设 x 是内置函数或变量。


如果Python在这些名字空间找不到 x,它将放弃查找并引发一个 NameError 的异常,同时传递
There is no variable named 'x' 这样一条信息。
 
 4. 函数闭包 (口述)  
    创建一个闭包函数需要满足哪几点: 

闭包(closure)是函数式编程的重要的语法结构。闭包也是一种组织代码的结构,它同样提高了代码的可重复使用性。

如果在一个内嵌函数里,对在外部函数内(但不是在全局作用域)的变量进行引用,那么内嵌函数就被认为是闭包(closure)。

定义在外部函数内但由内部函数引用或者使用的变量称为自由变量。

总结一下,创建一个闭包必须满足以下几点:

  • 1. 必须有一个内嵌函数
  • 2. 内嵌函数必须引用外部函数中的变量
  • 3. 外部函数的返回值必须是内嵌函数
 
5、装饰器(口述)
 本质上是一个函数。作用是用来装饰另一个函数(即被装饰函数),给被装饰函数添加功能。
前提是不能改变被装饰函数的源代码和调用方式。这样的一个函数称之为装饰器。
 
 
生成器和迭代器的区别?
可以被next()函数调用并不断返回下一个值的对象称为迭代器:Iterator

生成器都是Iterator对象,但listdictstr虽然是Iterable,却不是Iterator

listdictstrIterable变成Iterator可以使用iter()函数:

>>> isinstance(iter([]), Iterator)
True
>>> isinstance(iter('abc'), Iterator)
True

我们已经知道,可以直接作用于for循环的数据类型有以下几种:

一类是集合数据类型,如listtupledictsetstr等;

一类是generator,包括生成器和带yield的generator function。

这些可以直接作用于for循环的对象统称为可迭代对象:Iterable

可以使用isinstance()判断一个对象是否是Iterable对象:

 

  1. 如下,每个小字典的name对应股票名字,shares对应多少股,price对应股票的价格

  2.  

    portfolio = [
    {'name': 'IBM', 'shares': 100, 'price': 91.1},
    {'name': 'AAPL', 'shares': 50, 'price': 543.22},
    {'name': 'FB', 'shares': 200, 'price': 21.09},
    {'name': 'HPQ', 'shares': 35, 'price': 31.75},
    {'name': 'YHOO', 'shares': 45, 'price': 16.35},
    {'name': 'ACME', 'shares': 75, 'price': 115.65}
    ]
    

计算购买每支股票的总价

用filter过滤出,单价大于100的股票有哪些

portfolio = [
{'name': 'IBM', 'shares': 100, 'price': 91.1},
{'name': 'AAPL', 'shares': 50, 'price': 543.22},
{'name': 'FB', 'shares': 200, 'price': 21.09},
{'name': 'HPQ', 'shares': 35, 'price': 31.75},
{'name': 'YHOO', 'shares': 45, 'price': 16.35},
{'name': 'ACME', 'shares': 75, 'price': 115.65}
]

for por_name in portfolio:
print(por_name['name'],'的总价是%s'%(por_name['shares']*por_name['price']))
# print(list(filter(lambda x:x>=100,por_name['price'])))

f =list(filter(lambda x:x['price']>=100,portfolio))
print("股票大于100的有:",f)

2,有如下程序, 请给出两次调用show_num函数的执行结果,并说明为什么:

1
2
3
4
5
6
7
8
9
10
num = 20
 
   def show_num(x=num):
       print(x)
 
   show_num()
 
   num = 30
 
   show_num()

  如果函数收到的是一个不可变对象(比如数字、字符或者元组)的引用,就不能直接修改原始对象,相当于通过“传值’来传递对象,此时如果想改变这些变量的值,可以将这些变量申明为全局变量。

 

3,有列表 li = [‘alex‘, ‘egon‘, ‘smith‘, ‘pizza‘, ‘alen‘], 请以列表中每个元素的第二个字母倒序排序;

  #测试可以取得正确值并能显示成功

#print(sorted(list(map(lambda x:x[1:],li)),key= lambda x:x,reverse=True))
print(sorted(li,key=lambda x:x[1],reverse=True))

4,有名为poetry.txt的文件,其内容如下,请删除第三行;

1
2
3
4
5
6
7
昔人已乘黄鹤去,此地空余黄鹤楼。
 
黄鹤一去不复返,白云千载空悠悠。
 
晴川历历汉阳树,芳草萋萋鹦鹉洲。
 
日暮乡关何处是?烟波江上使人愁。
# 4,有名为poetry.txt的文件,其内容如下,请删除第三行;
# 方法一:
# import os
# p = ‘poetry.txt‘
# file = open(p,‘r‘,encoding=‘utf-8‘)
# print(file)
# pnew = ‘%s.new‘%p
# filenew = open(pnew,‘w‘,encoding=‘utf-8‘)
# str1 = ‘晴川历历汉阳树,芳草萋萋鹦鹉洲。‘
# for i in file:
#     if str1 in i:
#         i = ‘‘
#         filenew.write(i)
#     else:
#         filenew.write(i)
# file.close()
# filenew.close()
# os.replace(pnew,p)
# 方法二:逐行读取文件
import os
f1=open(‘poetry.txt‘, ‘r‘,encoding=‘utf-8‘)
 
str=‘晴川历历汉阳树,芳草萋萋鹦鹉洲。‘
with open(‘poetry1.txt‘, ‘w‘, encoding=‘utf-8‘) as f2:
    ff1=‘poetry.txt‘
    ff2=‘poetry1.txt‘
    for line in f1:
        if str in line:
            line=‘‘
            f2.write(line)
 
        else:
            f2.write(line)
f1.close()
f2.close()
os.replace(ff2,ff1)
View Code

 

 

5,有名为username.txt的文件,其内容格式如下,写一个程序,判断该文件中是否存在"alex", 如果没有,则将字符串"alex"添加到该文件末尾,否则提示用户该用户已存在;

1
2
3
pizza
alex
egon

  

1
2
3
4
5
6
7
8
9
10
11
# 5,有名为username.txt的文件,其内容格式如下,写一个程序,
# 判断该文件中是否存在"alex", 如果没有,
# 则将字符串"alex"添加到该文件末尾,否则提示用户该用户已存在;
with open(‘username.txt‘,‘r+‘,encoding=‘utf-8‘) as f:
    str1 = ‘alexx‘
    = f.read()
    print(i)
    if str1 in i:
        print("the user already exist in")
    else:
        f.write(‘\nalexx‘)

  

6,有名为user_info.txt的文件,其内容格式如下,写一个程序,删除id为100003的行;

1
2
3
pizza,100001
alex, 100002
egon, 100003
# 6,有名为user_info.txt的文件,其内容格式如下,
# 写一个程序,删除id为100003的行;
import os
a = ‘user_info.txt‘
b = ‘user_info1.txt‘
with open(a,‘r‘,encoding=‘utf-8‘) as f:
    with open(b, ‘w‘, encoding=‘utf-8‘) as f2:
        for i in f:
            if ‘100003‘ in i:
                pass
            else:
                f2.write(i)
os.replace(b,a)
View Code

相关文章: