习题1
写函数,函数可以支持接收任意数字(位置传参)并将所有数据相加并返回.
def my_sum(*args):
s = 0
for i in args:
s += i
return s
print(my_sum(1, 3, 5, 7, 4, 5)) # 25
习题2
看代码写结果
def func():
return 1, 2, 3
val = func()
print(type(val) == tuple)
print(type(val) == list)
结果:
True
False
习题3
看代码写结果
def func(*args, **kwargs):
pass
# a.请将执行函数,并实现让args的值为(1, 2, 3, 4)
func(1, 2, 3, 4)
# b.请将执行函数,并实现让args的值为([1, 2, 3, 4],[11, 22, 33])
func([1, 2, 3, 4], [11, 22, 33])
# c.请将执行函数,并实现让args的值为([11, 22], 33)且kwargs的值为{'k1': 'v1', 'k2': 'v2'}
func([11, 22], 33, k1='v1', k2='v2')
# d.如执行func(*{'武沛齐', '金鑫', '女神'}),请问args和kwargs的值分别为?
# 答:args的值为:'武沛齐', '金鑫', '女神' kwargs的值为:{}
# e.如执行func({'武沛齐', '金鑫', '女神'},[11, 22, 33]),请问args和kwargs的值分别为?
# 答:args的值为:{'武沛齐', '金鑫', '女神'},[11, 22, 33] kwargs的值为:{}
# f.如执行func('武沛齐', '金鑫', '女神',[11, 22, 33], {'k1': '栈'}),请问args和kwargs的值分别为?
# 答:args的值为:'武沛齐', '金鑫', '女神',[11, 22, 33], {'k1': '栈'} kwargs的值为:{}
习题4
看代码写结果
def func(name, age=19, email='123@qq.com'):
pass
# a.执行func('alex'),判断是否可执行,如可以请问name、age、email的值分别是?
# 答:name:'alex' age:19 email:'123@qq.com'
# b.执行func('alex', 20),判断是否可执行,如可以请问name、age、email的值分别是?
# 答:name:'alex' age:20 email:'123@qq.com'
# c.执行func('alex', 20, 30),判断是否可执行,如可以请问name、age、email的值分别是?
# 答:name:'alex' age:20 email:30
# d.执行func('alex',email='123@qq.com'),判断是否可执行,如可以请问name、age、email的值分别是?
# 答:name:'alex' age:19 email:'123@qq.com'
# e.执行func('alex',email='123@qq.com', age=99),判断是否可执行,如可以请问name、age、email的值分别是?
# 答:name:'alex' age:99 email:'123@qq.com'
# f.执行func(name='alex', 99),判断是否可执行,如可以请问name、age、email的值分别是?
# 答:不能执行,因为关键字参数不能再位置参数之前!
# g.执行func(name='alex', 99, 111@qq.com),判断是否可执行,如可以请问name、age、email的值分别是?
# 答:不能执行,因为关键字参数不能再位置参数之前!
习题5
看代码写结果
def fun(users, name):
users.append(name)
return users
result = fun(['武沛齐', '李杰'], 'alex')
print(result)
结果:
['武沛齐', '李杰', 'alex']
习题6
看代码写结果
def func(v1):
return v1 * 2
def bar(arg):
return '%s 是什么玩意?' % arg
val = func('你')
data = bar(val)
print(data)
结果:
你你 是什么玩意?
习题7
看代码写结果
def func(v1):
return v1 * 2
def bar(arg):
msg = '%s 是什么玩意?' % arg
print(msg)
val = func('你')
data = bar(val)
print(data)
结果:
你你 是什么玩意?
None
习题8
看代码写结果
v1 = '武沛齐'
def func():
print(v1)
func()
v1 = '老男人'
func()
结果:
'武沛齐'
'老男人'
习题9
看代码写结果
v1 = '武沛齐'
def func():
v1 = '景女神'
def inner():
print(v1)
v1 = '肖大侠'
inner()
func()
v1 = '老男人'
func()
结果:
肖大侠
肖大侠
习题10
看代码写结果
def func():
data = 2 * 2
return data
new_name = func
val = new_name()
print(val)
# 注意:函数类似于变量,func代指一块代码的内存地址
结果:
4
习题11
看代码写结果
def func():
data = 2 * 2
return data
data_list = [func, func, func]
for item in data_list:
v = item()
print(v)
# 注意:函数类似于变量,func代指一块代码的内存地址
结果:
4
4
4
习题12
看代码写结果(函数可以做参数进行传递)
def func(arg):
arg()
def show():
print('show函数')
func(show)
结果:
'show函数'
习题13
写函数,接收n个数字,求这些参数数字的和.(动态传参)
def my_sum(*args):
s = 0
for i in args:
s += i
return s
nums = input('选择要相加的数字以空格隔开:')
result = nums.split()
for index in range(len(result)):
result[index] = int(result[index])
print(my_sum(*result)) # 16
习题14
读代码,回答:代码中打印出来的值a,b,c分别是什么?为什么
a = 10
b = 20
def test5(a, b):
print(a, b)
c = test5(b, a)
print(c)
结果:
a: 20 b: 10 c: None在执行c = test5(b, a)的时候,传入的参数a: 10, b: 20执行是c = test5(20, 10),虽然形参def test(a, b)写着a在前面,但是这不影响实参传值,形参可以写任意名字跟接收实参,对值不影响,所以打印出来是a: 20, b: 10.
在看看c的值,c值接收的是函数的返回值,在没有设置返回值的时候,函数默认是返回None所以值是c: None
习题15
读代码,回答:代码中打印出来的值a、b、c分别是什么?为什么?
a = 10
b = 20
def test5(a, b):
a = 3
b = 5
print(a, b)
c = test5(b, a)
print(c)
结果:
a: 3, b: 5, c: None首先执行函数c = test(20,10)的时候,在执行函数test5(a, b)的时候这时候a: 20, b: 10;但是接着就执行a = 3, b = 5,这会导致a,b的原来指向断开,a指向了3,b指向了5.所以a: 3, b: 5
其次在函数执行完毕的时候没有设置返回值,那么就是默认返回值即是None.所以c: None
习题16
传入函数中多个列表和字典,如何将每个列表的每个元素依次添加到函数的动态参数args里面?如何将每个字典的所有键值对添加到kwargs里面?
依照如下例子所示即可:
def fun(*args, **kwargs):
print(args)
print(kwargs)
fun(*[3, 5, 7, 9], **{'name': '小明', 'age': 18, 'gender': 'male'})
#运行结果
# (3, 5, 7, 9)
# {'name': '小明', 'age': 18, 'gender': 'male'}
习题17
写函数,接收两个数字参数,将较小的数字返回.
def my_min(*args):
result = args[0]
for i in args:
if i < result:
result = i
return result
nums = input('输入2个数字以空格隔开:')
result = nums.split()
for index in range(len(result)):
result[index] = int(result[index])
print(my_min(*result))
# 运行结果:
# 输入2个数字以空格隔开:1 3
# 1
# 输入2个数字以空格隔开:4 2 8 4 2 3 4
# 2
习题18
写函数,接收一个参数(此参数类型必须是可迭代对象),将可迭代对象的每个元素以'_'相连接,形成新的字符串并返回.
from collections.abc import Iterable
list1 = []
def my_series(temp: Iterable):
try:
if isinstance(temp, Iterable):
for i in temp:
if isinstance(i, (int, float, bool)):
list1.append(str(i))
elif isinstance(i, str):
list1.append(i)
else:
my_series(i)
except Exception as e:
print(e)
finally:
return '_'.join(list1)
print(my_series([3, ['Mi', {'Guo': '果'}, {3.33, 'bye'}], 4, 'hello', {'name': '小丽', 1: 2}, (3, 6, False, 4.4)]))
# 3_Mi_Guo_bye_3.33_4_hello_name_1_3_6_False_4.4
习题19
有如下函数
添加任意代码使inner函数可被执行
def wrapper():
def inner():
print(666)
wrapper()
def wrapper():
def inner():
print(666)
inner()
wrapper()
习题20
相关面试题:
写出下列代码结果:
def foo(a, b, *args, c, sex=None, **kwargs):
print(a, b)
print(c)
print(sex)
print(args)
print(kwargs)
# foo(1, 2, 3, 4, c=6)
# a: 1
# b: 2
# c: 6
# sex:None
# args:(3, 4)
# kwargs:{}
# foo(1, 2, sex='男', name='alex', hobby='old_loman')
# c没有参数导致运行出错
# foo(1, 2, 3, 4, name='alex', sex='男')
# c没有参数导致运行出错
# foo(1, 2, c=18)
# a: 1
# b: 2
# c: 18
# sex:None
# args:()
# kwargs:{}
# foo(2, 3, [1, 2, 3], c=13, hobby='喝茶')
# a: 2
# b: 3
# c: 13
# sex:None
# args:([1, 2, 3],)
# kwargs:{'hobby': '喝茶'}
# foo(*[1, 2, 3, 4], **{'name': '太白', 'c': 12, 'sex': '女'})
# foo(1, 2, 3, 4, name='太白', c=12, sex='女')
# a: 1
# b: 2
# c:12
# sex:'女'
# args:(3, 4)
# kwargs:{'name': '太白'}