超高频 Python 面试题目 1️⃣ · TesterHome

您所在的位置:网站首页 lsp推文 超高频 Python 面试题目 1️⃣ · TesterHome

超高频 Python 面试题目 1️⃣ · TesterHome

2023-04-16 03:04| 来源: 网络整理| 查看: 265

面试官:看你简历写了 Python,那我们聊一下 Python 函数相关的?

我:好的,我们开始吧。😬

1、你知道 Python 函数的参数类型有几种?

Python 函数的参数类型主要有四种:

必需参数(Required arguments):必需参数是必须按照正确的顺序传递给函数的参数。在调用函数时,必须提供与函数定义中参数个数和顺序相匹配的实参。

关键字参数(Keyword arguments):关键字参数允许在调用函数时,通过参数名和值的形式传递参数。这种方式可以消除传递参数时顺序的困扰,同时也使得代码更易读。

默认参数(Default arguments):默认参数是在定义函数时,为某些参数设置默认值。当调用函数时,如果没有提供这些参数的实参,那么将使用默认值。

可变参数(Variable-length arguments):有时候,我们在定义函数时无法预知需要接受多少个参数。可变参数可以让函数接受任意数量的参数。在 Python 中,有两种可变参数:*args 和 **kwargs。*args 用来处理非关键字参数的可变数量,而 **kwargs 用来处理关键字参数的可变数量。

2、细说arg 和*kwargs 是什么意思?

*args 和 **kwargs 是 Python 中用于处理可变数量参数的两种特殊语法。它们通常在函数定义中使用,允许函数接受任意数量的参数。

*args:这个语法用于处理非关键字参数的可变数量。当在函数定义中使用 *args 时,它会将传递给函数的多个非关键字参数收集到一个元组中。这使得函数可以处理任意数量的非关键字参数。

例如:

def foo(*args): for arg in args: print(arg) foo(1, 2, 3, 4) # 输出:1 2 3 4 **kwargs:这个语法用于处理关键字参数的可变数量。当在函数定义中使用 **kwargs 时,它会将传递给函数的多个关键字参数收集到一个字典中。这使得函数可以处理任意数量的关键字参数。

例如:

def bar(**kwargs): for key, value in kwargs.items(): print(f"{key} = {value}") bar(a=1, b=2, c=3) # 输出:a = 1, b = 2, c = 3

*args 和 **kwargs 可以同时使用,使得函数能同时处理任意数量的非关键字参数和关键字参数。例如:

def baz(*args, **kwargs): for arg in args: print(arg) for key, value in kwargs.items(): print(f"{key} = {value}") baz(1, 2, 3, a=4, b=5, c=6) # 输出:1 2 3, a = 4, b = 5, c = 6

需要注意的是,args 和 kwargs 只是惯用的命名,可以随便用其他的名称,但保持 * 和 ** 符号不变就行啦

3、Python 函数传参,是引用还是值传参?

Python 函数传参采用的是对象引用传递,也称为 “传引用的值” 或 “传对象引用”。这意味着当向函数传递参数时,实际上传递的是对对象的引用(内存地址),而不是对象的值本身。

需要注意的是,根据参数对象的类型(可变对象或不可变对象),函数内部对参数的操作可能会影响到调用者作用域中的实际对象。

3.1 参数是不可变对象

当参数是不可变对象(例如字符串、数字、元组)时,函数内部对参数的任何更改都不会影响调用者作用域中的实际对象。这是因为不可变对象一旦创建就无法修改,所以函数内部的更改实际上会创建一个新的对象,而原始对象保持不变。

例如:

def modify_string(s): s = "New string" print("Inside the function:", s) original_string = "Original string" modify_string(original_string) print("Outside the function:", original_string) # 输出:Inside the function: New string # 输出:Outside the function: Original string 3.2 当参数是可变对象

当参数是可变对象(例如列表、字典、集合)时,函数内部对参数的更改可能会影响到调用者作用域中的实际对象。这是因为可变对象可以在其生命周期内修改,所以当在函数内部更改参数时,可能会影响到调用者作用域中的原始对象。

例如:

def modify_list(lst): lst.append("New element") print("Inside the function:", lst) original_list = ["Original element"] modify_list(original_list) print("Outside the function:", original_list) # 输出:Inside the function: ['Original element', 'New element'] # 输出:Outside the function: ['Original element', 'New element']

总结一下,Python 函数传参是通过对象引用传递的,但根据对象的类型(可变或不可变),函数内部对参数的操作可能会影响到调用者作用域中的实际对象。

4、什么是闭包,闭包和装饰器的区别?4.1 闭包

闭包(Closure)是指在一个外部函数(enclosing function)中定义的内部函数(nested function),这个内部函数引用了外部函数的局部变量。即使外部函数执行完毕,这些局部变量仍然保持在内存中,供内部函数使用。闭包在 Python 中是一种常见的编程模式,它提供了一种优雅的方式来定义在运行时创建的特定环境下执行的函数。

举个例子:

def outer_function(x): def inner_function(y): return x + y return inner_function closure = outer_function(10) print(closure(5)) # 输出:15

在这个例子中,inner_function 引用了外部函数 outer_function 的局部变量 x。当我们调用 outer_function(10) 时,它返回一个函数 inner_function,此时 x 的值为 10。尽管 outer_function 已经执行完毕,但 inner_function 仍然可以访问 x 的值。

4.2 装饰器

装饰器(Decorator)是一种特殊类型的闭包,它允许在不修改原始函数代码的情况下,为函数添加新功能。装饰器是一个接受函数作为参数的函数,并返回一个新函数,这个新函数包含了原始函数的功能以及装饰器所添加的功能。

举个例子:

def simple_decorator(func): def wrapper(*args, **kwargs): print("Before the function call") result = func(*args, **kwargs) print("After the function call") return result return wrapper @simple_decorator def my_function(): print("Inside the function") my_function() # 输出:Before the function call # 输出:Inside the function # 输出:After the function call

在这个例子中,simple_decorator 是一个装饰器,它接受一个函数 func 作为参数,并返回一个新函数 wrapper。wrapper 函数在调用原始函数之前和之后执行一些操作。@simple_decorator 语法糖用于将 my_function 函数传递给装饰器。

总结一下:闭包是一种编程模式,它涉及到在一个外部函数中定义的内部函数,这个内部函数引用了外部函数的局部变量。装饰器是一种特殊类型的闭包,它允许在不修改原始函数代码的情况下,为函数添加新功能。

5、你用过装饰器吗?用在什么场景?5.1 Python 装饰器的常见应用场景: 计时器装饰器:可以用装饰器计算函数执行所需的时间。 import time def timer_decorator(func): def wrapper(*args, **kwargs): start_time = time.time() result = func(*args, **kwargs) end_time = time.time() print(f"{func.__name__} took {end_time - start_time:.2f} seconds to run.") return result return wrapper @timer_decorator def example_function(): time.sleep(2) example_function() 记录日志装饰器:装饰器可以用来记录函数调用的日志,以便于调试和审计。 import logging def logging_decorator(func): def wrapper(*args, **kwargs): logging.info(f"Calling function {func.__name__}") result = func(*args, **kwargs) logging.info(f"Function {func.__name__} executed successfully") return result return wrapper @logging_decorator def example_function(): print("Hello, World!") example_function() 缓存装饰器:装饰器可以用来实现缓存功能。 from functools import lru_cache @lru_cache(maxsize=None) def fibonacci(n): if n


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3