3-3 Python函数常考题

Posted WinvenChang

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了3-3 Python函数常考题相关的知识,希望对你有一定的参考价值。

常考点:

  • 参数传递
  • (不)可变对象
  • 可变参数
一、以下Python代码分别输出什么?
  • 可变类型作为参数
def flist(l):
	l.append(0)
	print(l)

l = []
flist(l)  # [0]
flist(l)  # [0, 0]
  • 不可变类型作为参数
def fstr(s):
	s += 'a'
	print(s)

s = 'hehe'
fstr(s)  # hehe
fstr(s)  # hehe

以上代码考察点:传参方式;可变对象

二、Python如何传递参数

一个容易混淆的问题
1.传递值还是引用呢?都不是。唯一支持的参数传递是共享传参
2.Call by Object(Call by Object Reference or Call by Sharing)
3.Call by sharing(共享传参)。函数形参获得实参中各个引用的副本

说明:python中一切皆对象,一个变量对虾包括它的type(类型),id(在内存中的地址),value(变量的值)

三、Python可变/不可变对象

搞懂可变和不可变内置对象有利于理解函数参数的副作用
1.哪些是可变对象?哪些不可变?
2.不可变对象 bool/int/float/tuple/str/frozenset
3.可变对象 list/set/dict

四、一个小测试

检测下你是否理解了刚才说的例子?

# 一个小例题,请问这段代码会输出什么结果?
def clear_list(l):
	l = []

ll = [1, 2, 3]
clear_list(ll)
print(ll)  # [1, 2, 3]

python可变参数作为默认参数,记住默认参数只计算一次

def flist(l=[1]):
	l.append(1)
	print(l)

fl()  # [1, 1]
fl()  # [1, 1, 1]
五、Python *args, **kwargs

函数传递中 *args**kwargs含义是什么
1.用来处理可变参数
2.*args 被打包成 tuple
3.**kwargs被打包成 dict

代码示例一:

# 什么是 args?
def print_multiple_args(*args):
	print(type(args), args)  
	for idx, val in enumerate(args):
		print(idx, val)   

print_multiple_args('a', 'b', 'c')
# print_multiple_args(*['a', 'b', 'c'])  # 这个输出结果和 上一行 代码一致

运行结果:
在这里插入图片描述
代码示例二:

def print_kwargs(**kwargs):
	print(type(kwargs), kwargs)
	for k, v in kwargs.items():
		print('{{}: {}'.format(k, v))

print_kwargs(a=1, b=2)
# print_kwargs(**dict(a=1, b=2))  # 与上一行输出结果一致

运行结果:
在这里插入图片描述
代码示例三:

def print_all(a, *args, **kwargs):
	print(a)
	if args:
		print(args)
	if kwargs:
		print(kwargs)

print_all('hello', 'world', name='muke')

运行结果:
在这里插入图片描述

以上是关于3-3 Python函数常考题的主要内容,如果未能解决你的问题,请参考以下文章

5-6 Python 函数式编程常考题

Python语言基础常考题

4-7 Python数据结构常考题之栈与队列

4-5 Python数据结构常考题之链表

4-8 Python数据结构常考题之堆

4-6 Python数据结构常考题之二叉树