Python基础和高级【抽取复习】

1.Python 的深拷贝和浅拷贝有什么区别?

浅拷贝【ls.copy()】:
将列表的不可变对象【值】复制一份,同时引用其中的可变对象【列表】,共用一个内存地址
深拷贝【ls=copy.deepcopy(list)】:
完全的复制原可变对象,生成新的可变对象,两个对象互相独立

2.列表和元组的区别是什么?

 1. 列表
概念:有序序列,使用[ ]定义,元素之间用,隔开有序序列
增删改操作:可以增删改列表的任意元素不可变元素;
 2. 元组
概念:使用( )定义,元素之间用,隔开
增删改操作:
 - 元素项不可更改;
 - 元组中可变有序序列可以更改;
 - 不能删除元素项,只能删除整个元组

3.什么是迭代器,什么是生成器?在一个生成器用 yield 返回的中途把 yield 换成 return 是否可行?

迭代器:符合迭代器协议的对象,实现__iter__和__next__两个方法,前者表示迭代器本身,后者表示迭代器的下一个元素【例:斐波那契数列】,是用来访问的
生成器:是一个特殊的迭代器,按需动态生成值【惰性求值】,避免一次性生成大量数据占用大量内存,只有使用yield关键字时才会返回一个值,并且程序暂停执行,直至下一次迭代【状态保持】
生成器本身就是一个迭代器,调用使用yield关键字的函数,返回的是一个生成器对象,此时函数还没有执行,通过一个for循环,调用__next__方法时才会返回函数的值。在此过程中,yield会分段生成值。
而普通函数中使用return,返回的是该函数的结果,并且return用于终止函数,中途将yield改为return会导致生成器提前终止

4.lambda 的作用和适用场景是什么?

lambda函数就是没有名字的,只能使用一次的临时函数,一个函数体只有一条语句和一个返回值,用于实现简单功能。
lambda 返回值:表达式
适用场景:
- 简单计算
。搭配高阶函数map() reduce() filter()
- 拓展常用高阶函数:
。map应用到一个序列的每个元素,返回迭代器
ret=list(map(lambda x:x+2,ls))reduce对序列进行累计
ret=reduce(lambda x,y:x*y,ls)filter遍历序列中的元素,根据条件筛选,返回迭代器
ret=list(filter(lambda x:x%2==0,ls))

5.Python 和 Java 的多线程有什么区别?

Python线程执行受GIL限制,是单核执行;而Java可以多核并行执行
Python线程的创建方式是依赖threading模块;而Java是依赖Runnable接口或Thread类
Python的线程同步是使用Lock、Semaphore等同步原语;而Java是使用synchronized等关键字
Python线程池的创建通过concurrent.futures.ThreadPoolExecutor或multiprocessing.pool.ThreadPool实现;而Java通过ExecutorService接口及Executors工厂类创建线程池
Python线程适用场景是I/O密集型任务;而Java则适用于I/O密集型任务和CPU密集型任务

6.Python 的装饰器是什么?请举例说明其作用。

- 装饰器本质上是一种特殊的嵌套函数【在一个函数内部又定义了另一个函数】
它接收一个函数【被装饰的函数】作为参数,返回一个新的函数【装饰后的函数】
装饰器最大的作用就是可以让我们在不改变被装饰函数的情况下,给被装饰函数添加新的功能。
# 定义装饰器
def disc(func):
    def inner():
        print('我是生活在一个小树苗下的小草')
        func()
        print('我是小树苗庞的石头')
    return inner

# 被装饰函数
def func():
    print('我是一棵小树苗')

func=disc(func)
func()

7.如何加载一个文本文件并获取其中最长的英文单词?

编程思路:
- 打开文件获取数据【with open('path','r',encoding='utf-8') as file:- 清洗数据【去除非英文字符,分割为单词】
- 比较单词长度【直接用max(单词列表,key=len)或使用len()函数遍历比较】
import re

def find_longest_english_word(file_path):
    # 打开文件并读取内容
    with open(file_path, 'r', encoding='utf-8') as file:
        content = file.read()
    
    # 清洗数据:移除所有非英文字母字符,并转换为小写
    cleaned_content = re.sub(r'[^a-zA-Z]', ' ', content).lower()
    
    # 将文本分割成单词列表(连续的英文字母视为一个单词)
    words = cleaned_content.split()
    
    # 过滤出仅包含英文字母的单词(确保没有残留的非字母字符)
    english_words = [word for word in words if word.isalpha()]
    
    # 处理空文件的情况
    if not english_words:
        return None
    
    # 使用max函数找到最长的单词
    longest_word = max(english_words, key=len)
    
    return longest_word

# 使用示例
if __name__ == "__main__":
    file_path = "example.txt"  # 替换为实际文件路径
    longest_word = find_longest_english_word(file_path)
    
    if longest_word:
        print(f"最长的英文单词是: {longest_word},长度为 {len(longest_word)}")
    else:
        print("文件中未找到英文单词。")

8.is 和 == 的区别是什么?

is:判断两个对象是否指向同一内存地址
一般判断对象是否是:NoneTrueFalse
==:判断两个值是否相等

9.range 是什么?

- Python的一个内置函数,用于生成不可变的整数序列
- 参数:range(start,stop,step)
.开始【包含】
.结束【不包含】
.步长【可以为负值,此时start必须大于stop才是有效的】

10.给你一个数字序列,怎么求其中的质数?

质数:大于1且只能被1和本身整除
ls=[1,3,5,7,9]
判断思路:
- n<=1  小于等于1不是质数
- n==2  2是质数,其他偶数都不是质数
- n>2    奇数,检查从3到n的算数平方根能否整除
- 遍历列表执行上面三步操作
【注意】:
- 如果序列很长,可以使用迭代器获取列表内的值,节省内存
- 对于超大规模序列,可以考虑使用多进程/多线程加速判断

11.怎么改变 list 的类型,比如如何把一个列表变成一个集合或者一个元组?

在python中直接使用内置函数转换就可以
list_set=set(list)【会自动去重】
list_tuple=tuple(list)

12.知道 reduce 函数吗?其作用是什么?

reduce函数是一种高阶函数
作用:对序列进行累计,这里的累计可以是加减乘除
ls=[1,2,3,4,5]
reduce(lambda x,y:x*y,ls)=1*2*3*4*5=120

你可能感兴趣的:(python,学习)