Python-基础问题(二)

前言

接着上次的Python基础面试题

题目:

  1. Python3和Python2中 int 和 long的区别?
  2. 4G 内存怎么读取一个 5G 的数据?
  3. read、readline 和 readlines 的区别?
  4. 文件操作时:xreadlines和readlines的区别?
  5. 列举布尔值为False的常见值?
  6. 字符串、列表、元组、字典每个常用的5个方法?
  7. lambda表达式格式以及应用场景? 用lambda函数的好处?
  8. pass的作用?continue的作用? break的作用?
  9. *arg和**kwarg作用
  10. is和==的区别
  11. 简述Python的深浅拷贝以及应用场景?
  12. 拷贝的注意点?
  13. Python垃圾回收机制?
  14. Python的可变类型和不可变类型?
  15. 列举常见的内置函数?

Python3和Python2中 int 和 long的区别?

python2 中分int型 和 long型,long型为长整型比int型的取值范围要大

Python3 取消long型 将int型的取值范围扩大到long型的范围

4G 内存怎么读取一个 5G 的数据?

分段读取,每次读取固定的内容,与网络传输的分段传输差不多。
def get_lines(): # 生成器
with open(‘123.py’, ‘r’) as f:
while True:
data = f.readlines(100)
if data:
yield data
else:
break

f = get_lines()  # 迭代器对象
print(next(f))

read、readline 和 readlines 的区别?

  1. read() 方法用来直接读取字节到字符串中, 最多读取给定数目个字节. 如果没有给定 size 参数(默认值为 -1)或者 size 值为负, 文件将被读取直至末尾. 未来的某个版本可能会删除此方法.

  2. readline() 方法读取打开文件的一行(读取下个行结束符之前的所有字节). 然后整行,包括行结束符,作为字符串返回. 和 read() 相同, 它也有一个可选的 size 参数, 默认为 -1, 代表读至行结束符. 如果提供了该参数, 那么在超过 size 个字节后会返回不完整的行.

  3. readlines() 方法并不像其它两个输入方法一样返回一个字符串. 它会读取所有(剩余的)行然后把它们作为一个字符串列表返回. 它的可选参数 sizhint 代表返回的最大字节大小. 如果它大于 0 , 那么返回的所有行应该大约有 sizhint 字节(可能稍微大于这个数字, 因为需要凑齐缓冲区大小).

文件操作时:xreadlines和readlines的区别?

readlines 返回一个列表

xreadlines 返回一个生成器

列举布尔值为False的常见值?

False None ‘’ 0 [] {} () set() 不成立的表达式

字符串、列表、元组、字典每个常用的5个方法?

字符串:

  1. find通过元素找索引,可切片,找不到返回-1
  2. index,找不到报错。
  3. split 由字符串分割成列表,默认按空格。
  4. captalize 首字母大写,其他字母小写。
  5. upper 全大写。
  6. lower 全小写。
  7. title,每个单词的首字母大写。
  8. startswith 判断以什么为开头,可以切片,整体概念。
  9. endswith 判断以什么为结尾,可以切片,整体概念。
  10. format格式化输出
  11. strip 默认去掉两侧空格,有条件, 12,lstrip,rstrip 14,center 居中,默认空格。
  12. count查找元素的个数,可以切片,若没有返回0
  13. expandtabs 将一个tab键变成8个空格,如果tab前面的字符长度不足8个,则补全8个,
  14. replace(old,new,次数)
  15. isdigit 字符串由字母或数字组成 isalpha, 字符串只由字母组成 isalnum 字符串只由数字组成
  16. swapcase 大小写翻转
  17. for i in 可迭代对象。

###字典:

  1. key: 输出所有的键
  2. clear:清空
  3. dic:删除的键如果没有则报错
  4. pop:键值对删,有返回,没有原来的键会报错(自行设置返回键就不会报错)
  5. popitem:随机删键值对
  6. del:删除的键如果没有则报错

列表:

  1. append:在后面添加。
  2. Insert按照索引添加,
  3. expend:迭代着添加。
  4. list.extend(seq) - 在列表末尾一次性追加另一个序列中的多个值(用新列表扩展原来的列表)
  5. pop 删除 (pop 有返回值)
  6. remove 可以按照元素去删
  7. clear 清空列表
  8. del 1、可以按照索引去删除 2、切片 3、步长(隔着删)
  9. list.count(obj) - 统计某个元素在列表中出现的次数
  10. list.index(obj) - 从列表中找出某个值第一个匹配项的索引位置
  11. list.reverse() - 反向列表中元素
  12. list.sort([func]) - 对原列表进行排序

###元组:

  1. cmp(tuple1, tuple2):比较两个元组元素。
  2. len(tuple):计算元组元素个数。
  3. max(tuple):返回元组中元素最大值。
  4. min(tuple):返回元组中元素最小值。
  5. tuple(seq):将列表转换为元组。

lambda表达式格式以及应用场景? 用lambda函数的好处?

匿名函数:为了解决那些功能很简单的需求而设计的一句话函数
函数名 = lambda 参数 :返回值

  • 参数可以有多个,用逗号隔开
  • 匿名函数不管逻辑多复杂,只能写一行,且逻辑执行结束后的内容就是返回值
  • 返回值和正常的函数一样可以是任意数据类型

    #lambda 表达式
    
    temp = lambda x,y:x+y
    
    print(temp(4,10))   
    
    #可替代:
    def foo(x,y):
        return x+y
    print(foo(4,10))    
    

pass的作用?continue的作用? break的作用?

###pass
pass是空语句,是为了保持程序结构的完整性。pass 不做任何事情,一般用做占位语句。

###continue
退出本次循环,执行下一次循环

###break
结束循环

*arg和**kwarg作用

*args代表位置参数,它会接收任意多个参数并把这些参数作为元祖传递给函数。

**kwargs代表的关键字参数,返回的是字典,位置参数一定要放在关键字前面

is和==的区别

is 比较的是两个实例对象是不是完全相同,它们是不是同一个对象,占用的内存地址是否相同。

== 比较的是两个对象的内容是否相等,即内存地址可以不一样,内容一样就可以了。默认会调用对象的 eq()方法。

a = 'lishi'
str1 = "li"
str2 = "shi"
str3 = str1 + str2
print("a == str3",a == str3)
print("a is str3",a is str3)
print("id(a)",id(a))
print("id(str3)",id(str3))
# a == str3 True    ==  ---> 只需要内容相等
# a is str3 False   is  ---> 只需要内存地址相等
# id(a) 38565848
# id(str3) 39110280

简述Python的深浅拷贝以及应用场景?

浅拷贝只是增加了一个指针指向一个存在的地址,

而深拷贝是增加一个指针并且开辟了新的内存,这个增加的指针指向这个新的内存,
采用浅拷贝的情况,释放内存,会释放同一内存,深拷贝就不会出现释放同一内存的错误

一层的情况:

import copy

 #浅拷贝
li1 = [1, 2, 3]
li2 = li1.copy()
li1.append(4)
print(li1, li2)  # [1, 2, 3, 4] [1, 2, 3]

# 深拷贝
li1 = [1, 2, 3]
li2 = copy.deepcopy(li1)
li1.append(4)
print(li1, li2)  # [1, 2, 3, 4] [1, 2, 3]

多层的情况:

import copy

# 浅拷贝 指向共有的地址
li1 = [1, 2, 3,[4,5],6]
li2 = li1.copy()
li1[3].append(7)
print(li1, li2)  # [1, 2, 3, [4, 5, 7], 6] [1, 2, 3, [4, 5, 7], 6]

# 深拷贝 重指向
li1 = [1, 2, 3,[4,5],6]
li2 = copy.deepcopy(li1)
li1[3].append(7)
print(li1, li2)  # [1, 2, 3, [4, 5, 7], 6] [1, 2, 3, [4, 5], 6]

拷贝的注意点?

区分深拷贝与浅拷贝

Python垃圾回收机制?

引用计数

标记清除

分代回收

python垃圾回收机制详解

Python的可变类型和不可变类型?

可变类型:

  • 列表
  • 字典(索引不可变)
  • 可变集合

不可变类型:

  • 字符串
  • 数字
  • 元祖
  • 不可变集合

列举常见的内置函数?

①map():对可迭代对象中的每个元素都进行相同的处理,最后返回一个新的可迭代对象,python2中直接返回列表形式

②filter():对可迭代对象中的每个元素进行筛选,最后将符合条件的元素装进一个新的可迭代对象里,python2中直接返回列表形式

③reduce():对可迭代对象中的元素进行一个操作(如所有的值加起来),最后返回新数值

#===========input========输入
s = input("请输入内容 : ")  #输入的内容赋值给s变量
print(s)  #输入什么打印什么。数据类型是str
# ==========abs==========绝对值
print(abs(-1))  # 1

# ==========all==========可迭代对象的每个元素的布尔操作都是True时返回True,若传入的可迭代对象是空则返回True
print(all(['', 1, 's']))  # False

# ==========any==========可迭代对象的每个元素的布尔操作中有一个是True时就返回True,若传入的可迭代对象是空则返回True
print(any(['', 5, '0']))  # Ture

# ==========bin==========将十进制数转成二进制数
print(bin(3))  # 0b11

# ==========hex==========将十进制数转成十六进制数
print(hex(10))  # 0xa

# ==========oct==========将十进制数转成八进制数
print(oct(8))  # 0o10

# ==========bool==========布尔值操作: 空 0 None 布尔操作为False
print(bool([]))  # False

# ==========bytes==========编码 将传入的字符串用某种编码方式转换成二进制
print(bytes('陈', encoding='utf-8'))  # b'\xe9\x99\x88'
print(bytes('陈', encoding='utf-8').decode('utf-8'))  # 陈  # 译码 译码与编码应采用一样的

# ==========chr==========将ASCII码转成对应字符
print(chr(97))  # a

# ==========ord=========将字符转成对应的ASCII码值
print(ord('a'))  # 97

# ==========dir==========打印某种对象里面的所有属性
print(dir(all))

# ==========divmod==========参数1除以参数2 返回一个元组(商,余数)
print(divmod(10, 3))  # (3, 1)

# ==========eval==========
dic = {'name': 'chen'}
dic_str = str(dic)
# ===================================功能1:提取成传入的字符串中的数据类型
print(dic_str)  # '{'name': 'chen'}'
print(type(dic_str))  # <class 'str'>
print(eval(dic_str))  # {'name': 'chen'}
print(type(eval(dic_str)))  # <class 'dict'>
# ===================================功能2:计算字符串中的数学运算
s = '1 + 2 * 1'
print(eval(s))  # 3

# ==========hash==========hash运算
print(hash('chen'))  # -1076846465005340399
print(hash('chenyuanyuan'))  # -8978753568388561982  #hash()---->hash运算

# ==========help==========函数功能解释
print(help(all))

# ==========isinstance==========判断某个对象是否是某种数据类型的实例对象
print(isinstance('2', str))  # True

# ==========globals、locals==========全局变量、局部变量
name = 'chen'


def test():
    age = 18
    print(globals())  # 打印所有的全局变量,包括name
    print(locals())  # {'age': 18} #打印所有的局部变量


test()

# ==========min、max==========最小值、最大值
dic = {'chen': 100, 'wang': 200, 'li': 500, 'do': 600}
# ============一个可迭代参数
print(min(['a01', 'b10', 'c1']))  # a01 遍历出每个元素,比较它们的的第一位的ASCII码值,找到最小后就停止比较
# print(min(['a01', 'b10', 'c1', 30])) #报错 不同数据类型无法比较
print(min(dic))  # chen
print(max(dic))  # wang
print(min(dic.values()))  # 100
print(max(dic.values()))  # 600
print(max(zip(dic.values(), dic.keys())))  # (600, 'do') #max与zip结合找出value值最大的那一组
# ============两个参数
print(min(dic, key=lambda k: dic[k]))  # chen
print(max(dic, key=lambda k: dic[k]))  # do

# ==========zip==========拉链操作,将多个可迭代对象(列表,元组,字符串)对应元素组成一个元组,多余元素自动去掉,返回可迭代对象
print(list(zip('abc', 'def', 'ghihhhhh')))  # [('a', 'd', 'g'), ('b', 'e', 'h'), ('c', 'f', 'i')]
print(list(zip(dic.keys(), dic.values())))  # [('chen', 100), ('wang', 200), ('li', 500), ('do', 600)]

# ==========pow==========参数1的参数2次方,结果对参数3进行取余操作
print(pow(2, 3))  # 8
print(pow(2, 3, 1))  # 0

# ==========reversed==========反转可迭代对象中元素的排列顺序,返回迭代器
a = [1, 2, 3]
print(list(reversed(a)))  # [3, 2, 1]

# ==========round==========四舍五入取整
print(round(2.66))  # 3

# ==========set==========将其他数据类型转换成集合
print(set('hello'))  # {'h', 'o', 'e', 'l'}

# ==========slice==========切片:参数1-->起始索引,参数2-->结束索引,参数3-->步长
a = 'ehllovihgh'
s1 = slice(2, 6, 2)
print(s1.start)  # 2
print(s1.stop)  # 6
print(s1.step)  # 2
print(a[s1])  # lo

# ==========sorted==========排序
a = [1, 25, 2, 3]
print(sorted(a)) #[1, 2, 3, 25]  #不同数据类型任然无法进行排序比较
lists = [{'name': 'chen', 'age': 18}, {'name': 'wang', 'age': 25}, {'name': 'li', 'age': 9}]
print(sorted(lists, key = lambda dic:dic['age']))
#[{'name': 'li', 'age': 9}, {'name': 'chen', 'age': 18}, {'name': 'wang', 'age': 25}]
info = {'liu': 100, 'li': 12200, 'chen': 100000}
print(sorted(info.keys()))  #['chen', 'li', 'liu']  #比较key值
print(sorted(info.values())) #[100, 12200, 100000]  #比较value值
print(sorted(info, key = lambda key: info[key]))   #['liu', 'li', 'chen'] #比较value值,返回key值
print(sorted(zip(info.values(), info.keys())))   #[(100, 'liu'), (12200, 'li'), (100000, 'chen')]

# ==========type==========查看数据类型
print(type('ll'))  # <class 'str'>

# ==========sum==========求和
print(sum([5, 2, 3])) #10

# ==========range==========范围
for item in range(5):
    print(item)
# 0
# 1
# 2
# 3
# 4
for item in range(5, 7):
    print(item)
# 5
# 6

# ==========__import__==========引入字符串类型的模块名
m = __import__('...')
m.函数名()

常用内置函数列举

赏瓶可乐吧(*^▽^*)