习题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': '太白'}