美文网首页
day9-函数2

day9-函数2

作者: 2333_11f6 | 来源:发表于2018-11-15 17:39 被阅读0次

9.1 函数的调用

函数在声明时不会执行函数体,只有在调用函数的时候才会执行函数体

  • 函数的调用过程(重点!)

a.物理过程
1.回到函数声明位置
2.用实参给形参赋值(传参),需要保证每个形参都有值。
3.执行函数体
4.获取返回值
5.回到函数调用位置,接着往后执行

b.函数调用过程是一个压栈的过程
当函数调用时,系统会自动地在内存中的栈区间开辟空间,存储函数调用过程中产生的数据(这里的数据包括参数和在函数中声明的变量)。当函数调用完成后,对应的内存空间会自动销毁。

def exchange(a1, b):          # 同名会有灰色波浪线
    a1, b = b, a1
    print('函数中:', a1, b)


a, b = 10, 20
exchange(a, b)              # 函数中: 20 10
print('函数外:', a, b)    # 函数外: 10 20

9.2 函数的参数

  • 1.根据实参分为位置参数和关键字参数

a.位置参数
让实参位置和形参位置一一对应

def fun1(a, b, c):
    print('a:%d b:%d c:%d' % (a, b, c))


fun1(10, 20, 66)  # a:10 b:20 c:66

b.关键字参数
实参以”形参名=值“的形式来传参

fun1(c=66, a=10, b=20)  # a:10 b:20 c:66

c.位置参数和关键字参数混合使用
前提:保证每个参数都有值且位置参数要放在关键字参数前。

fun1(10, c=66, b=20)  # a:10 b:20 c:66
    1. 从函数声明角度又有:参数默认值,不定长参数,参数类型说明

a.参数默认值
声明函数时,可以给参数设置默认值,语法:参数名 = 默认值
设置默认值的参数需要放在未设置默认值参数的后面。
注意:
设置默认值可给参数赋一个默认值,也常用于说明需要传入参数的类型

# 声明函数,并给参数c赋默认值1
# 有的参数有默认值,有的参数没有;有默认值的参数一定要放在后面。
def fun2(a, b, c=1):
    print(a, b, c)


# 如果函数声明时参数有默认值,调用函数时,有默认值的参数可不赋值
fun2(10, 20)  # 10 20 1
  • 3.不定长参数
    不定长参数:声明函数时,函数的参数不确定。

a.在声明函数时,参数名前加一个*,会将这个参数变成元组,来获取多个参数的值。通过位置参数调用

# 声明一个函数,功能是求多个数的和
def my_sum(*num):
    print(sum(num))


# 调用参数是不定长参数的时候,不定长参数对应的位置,可以传任意个实参
my_sum(1, 2, 3, 3, 5, 7, 8, 9, 40)   # 78 集合才是无序可变且不重复

b.在声明函数时,参数名前加两个*,会将这个参数变成字典,来获取多个实参的值。必须使用关键字参数

def fun4(**kwargs):
    print(kwargs)           # 字典


# fun4(1, 2, 4)  位置参数调用,报错
# 如果是调用不定长参数,调用时关键字可以随便命名。
fun4(a=1, b=3, c=8, j=9)          # {'a': 1, 'b': 3, 'c': 8, 'j': 9}

c.(*args, **kwargs) - 用来表示不定长参数,调用时更灵活,可用位置参数也可用关键字参数或两者一起传参数。
*注意:
*args 必须放在 **kwargs之前,应为前者为位置参数,后者为关键字参数。

def func5(*args, **kwargs):
    print(args, kwargs)


func5()                                # () {}
func5(6, 7, 8)                         # (6, 7, 8) {}
func5(a=6, b=7, c=8)                   # () {'a': 6, 'b': 7, 'c': 8}
func5(6, 7, 8, a=6, b=7, c=8)          # (6, 7, 8) {'a': 6, 'b': 7, 'c': 8}

# 练习:求多个数的和,要求调用函数时可以多样性(位置,关键字)


def my_sum(*args, **kwargs):
    sum1 = 0
    for key in kwargs:
        sum1 += kwargs[key]
    print(sum(args)+sum1)


my_sum()                               # 0
my_sum(6, 7, 8)                        # 21
my_sum(a=6, b=7, c=8)                  # 21
my_sum(6, 7, 8, a=6, b=7, c=8)         # 42
  • 4.参数类型说明
    参数类型说明只是对参数类型进行提示,并不能限制参数类型。可弹出语法提示。

a.设置默认值

b.参数名:类型名
注意:类型说明除了说明类型外,还可以做相应类型对应的语法提示。

def func7(a: str, b=''):   # 都能给类型说明
    print(a, b)


func7(1, '2')          # 只能提示,不能限制。

9.3 函数的返回值

  • 1.返回值

a.函数的返回值就是return关键字后面表达式的值,就是函数调用表达式的值。

b.python中所有函数都有返回值,默认为None。
return - 关键字;用来返回返回值;结束函数(当函数在执行过程中遇到了return就会结束函数),如果函数体中没有return,函数会在函数体执行完成后将None作为返回值。
函数调用表达式 - 就是调用函数的语句(如:func1(1, 2));当函数调用完成后,函数调用表达式的结果就是函数返回值。
看一个函数返回值,就是看return后面的值,没有return则为None。

def func1(m, n):
    print(m, n)
    # 将100作为函数func1的返回值
    return 100        # return - 关键字    100 - 返回值


def func2(m, n):
    return m + n


def func3(m, n):
    return              # 相当于return None;将None作为返回值
    print()             # 执行不到


func2(1, 2)          # 3,需要被接收或直接使用

print(func1(1, 2))    # None 即返回值

返回值作用:就是将函数内产生的数据传递出来,防止在函数调用完成后被销毁。
什么时候使用返回值:如果实现函数功能后需要获取产生的数据则需要返回。

  • 2.同时返回多个值

python中支持返回多个值,实质是以元组形式返回。元组的功能它都有。
return 返回值1,返回值2,返回值3...

# 求多个数的和以及平均值
def func7(*args):
    # sum1 = 0
    # for item in args:
    #     sum1 += item
    sum1 = sum(args)
    aver = sum1/len(args)
    return sum1, aver


sum1, aver = func7(1, 2, 3, 4, 5)             # 常用
print('和为%d,平均值为%.2f' % (sum1, aver))   # 和为15,平均值为3.00
print('和为%d,平均值为%.2f' % func7(1, 2, 3, 4, 5))  # 和为15,平均值为3.00

9.4 返回值的应用

返回值能做的事情,函数调用表达式都可以做。

#1.用函数调用表达式给变量赋值
def func1():
    return 'hello'


str1 = func1()

# 2.通过函数调用表达式使用相应的方法。
def func2():
    return [1, 2, 3]


item1 = func2()[0]         # 1
item2 = func1()[0]         # h
item3 = func2().append(3)  # None,获取的是append函数的返回值

list1 = func2()
list1.append(3)
print(list1)                 # [1, 2, 3]


# 3.将函数调用表达式作为容器的元素,函数的参数,函数的返回值


def func3():
    return 100


def func4(x):
    print(x)

# 作为函数实参
func4(func3())       # 100
re = func4(func3())  # 返回None之前要打印一次func3()
print(re)

# 作为列表元素
# 作为字典的key和value
# 作为函数返回值

9.5 匿名函数

匿名函数还是函数,除了声明语法以外,函数其他语法匿名函数都支持。

  • 匿名函数声明

语法:

函数名(变量名) = lambda 参数列表:返回值

说明:
函数名 - 变量名
lambda - 关键字
参数列表 - 和普通函数参数列表作用和要求是一样的,但此处至少要1个参数
返回值 - 相当于普通函数return关键字后面的表达式。
注意:匿名函数中冒号后的语句属于函数体。在声明时不会执行
匿名函数调用和普通函数一模一样。

# 匿名函数求两数和

my_sum = lambda x, y: x + y

print(my_sum(1, 2))
print(my_sum(y=2, x=3))  # 5 关键字参数

# sort()函数定制

# 写一个函数,求两数中最大值
my_max = lambda x, y: max(x, y)
print(my_max(1, 2))                # 2
  • 补充:python中的3目运算符

c语言: 条件语句?值1:值2 - 条件语句为True则整个表达式结果为值1,反之。

python中三目: 值1 if 条件语句 else 值2 - 条件语句为True则整个表达式结果为值1,反之。

x, y = 10, 20
max1 = 10 if x > y else y
print(max1)

# 写一个匿名函数,获取字典中指定key对应的值
dict1 = {'a': 1}
my_get_value = lambda key, dict2: dict2.get(key)

print(my_get_value('a', dict1))

相关文章

  • 2020-10-10推导式和函数及作业

    day9-推导式和函数及作业 --列表元祖字典集合字符串表示方式:[元素1,元素2...](元素1,元素2...)...

  • day9-函数2

    9.1 函数的调用 函数在声明时不会执行函数体,只有在调用函数的时候才会执行函数体 函数的调用过程(重点!) a....

  • day9-函数2-homework

    1.写一个函数将一个指定的列表中的元素逆序(例如[1, 2, 3] -> [3, 2, 1])(注意:不要使用列表...

  • day9-函数

    1.函数的调用 函数在声明的时候不会执行函数体,只有在调用函数的时候才会执行函数体 函数的调用的过程 第一步:回到...

  • day9-函数

    02-函数调用 函数在声明的时候不会执行函数体,只有在调用的时候才会执行函数体 1.函数的调用过程 物理过程:1....

  • day9-函数

    函数在声明的时候不会执行函数体,只有在调用的时候才会执行函数体.* 1. 函数的使用: 1.1函数的调用过程(重点...

  • day9-函数

    一.函数的调用 函数在声明的时候不会执行函数体只有在调用函数的时候才会执行函数体 函数的调用过程(重点!) a.物...

  • Day9-函数

    一:概论 1.什么是函数 函数就是对实现特定功能的代码的封装 2.函数的分类 系统函数(内置函数) - 系统已经...

  • Day9-函数基础

    一、浅拷贝和深拷贝 拷贝:将变量中的值赋值一份,产生新的数据。然后将新的数据对应的地址返回。 浅拷贝:直接拷贝地址...

  • day9-函数基础

    一、浅拷贝和深拷贝 import copycopy.copy(对象):浅拷贝copy.deepcopy(对象):深...

网友评论

      本文标题:day9-函数2

      本文链接:https://www.haomeiwen.com/subject/exzyfqtx.html