Day9函数

函数

1.什么是函数?

函数就是对实现某一特定功能的代码段的封装

2.函数的分类

系统函数和自定义函数。
系统函数 --系统已经给我们定义好的函数,程序员可以直接调用
print() input() id() type() chr() bin()
自定义函数 --需要程序员自己去定义的函数

3.函数的定义:

a.语法
def 函数名(参数列表)
函数体
b.说明
def --Python中声明函数的关键字
函数名 --与标识符命名要求一致,不能是关键字 PEP8命名规范:见名知意,全部小写,下划线隔开
() --固定格式
参数列表: --参数1,参数2,参数3.。。。--这儿的参数叫形参
定义的时候形参就是变量名 功能是将函数外面的数据传递到函数里面来
: --固定格式
韩实体: --一个完整的函数体包括:函数说明文档,实现函数功能的代码段,函数返回值
c.初学者声明函数的步骤:

第一步:确定函数功能
第二步:根据功能使用函数名
第三步:确定形参 ---确定需不需要参数,确定需要几个 看实现函数的功能需要传几个值
第四步:实现函数的功能
第五步:确定函数的返回值
注意函数在声明的时候是不会执行函数体的

4.函数的调用

a.语法:
函数名(实参列表)
b.说明:
函数名:调用哪个函数就写谁 注:这个函数名对应的函数必须是已经声明的函数
实参列表:实参是用来给形参赋值的,这个过程叫传参。--形参与实参要一一对应
c.调用过程:

第一步:回到函数命名的位置
第二步:传参
第三步:执行函数体
第四步:执行完函数体就确定并返回返回值
第五步:再回到函数调用的位置,接着执行后面的其他代码

# 写一个函数,求两个数的和

a = int(input('输入第一个数'))
b = int(input('输入第二个数'))


def ly_sum(sum1, sum2):
    c = sum1 + sum2
    print(sum1, sum2)
    print(c)


ly_sum(a, b)
# 声明一个函数,打印n的阶乘
num3 = int(input('请输入一个数:'))


def jiecheng(n):
    j = 1
    for i in range(1, n+1):
        j *= i
    print(j)


jiecheng(num3)
# 声明一个函数,打印一个列表中指定元素的下标:
list2 = [11, 23, 45, 567, 2345]
num = int(input('请输入需要查找的元素:'))


def quxiabiao(list1, item):
    count = 0
    for index in range(len(list1)):
        if list1[index] == item:
            print(index)
            count = count + 1
    if count == 0:
        print('列表中没有该元素')


quxiabiao(list2, num)

练习:
声明一个函数,进行猜数字游戏:
随机产生一个数字,用户不断输入数字,直到输入的数字与产生的数字一样,游戏结束
猜错了给出数字大了,小了的提示
随机数的产生:import random:导入random模块,random.randomint(0,100) 产生一个M到N的随机整数

import random


def caishuzi():
    num = random.randint(0, 100)
    while True:
        num1 = int(input('请输入一个数'))
        if num1 > num:
            print('大咸鱼')
        elif num1 < num:
            print('小咸鱼')
        else:
            print('恭喜你,猜对了,但你还是条咸鱼')
            break


caishuzi()

参数

1.位置参数和关键字参数(根据实参的传递方式对参数进行分类)

a.位置参数:
实参的位置与形参保持一致,按参数出现的先后顺序一一赋值
b.关键字参数:
调用函数的时候,以形参=实参的的形式进行传参,这个时候实参的顺序无所谓。

def fuc1(s, d, f):
    print('咸鱼')


fuc1(1, 2, 3)
# 通关位置参数进行传参
fuc1(s=30, d=10, f=10)
# 通过关键字参数进行传参
fuc1(1, 3, f=12)
# 通过位置参数和关键字参数进行传参

注意:关键字参数必须在位置参数后边。

2.参数默认值:

声明函数的时候,可以给参数赋默认值
如果一个形参有默认值了,那么在调用函数的时候这个参数就可以不用传参了
如果有的参数有默认值有的参数没有默认值,有默认值的要放在没有默认值的后面。
调用函数的时候要保证每个参数都有值。

def fuc2(a, b, c=10):
    print(a, b, c)
# c有默认值,调用函数的时候不用给c传参


fuc2(100, 200)
3.对参数进行说明:

如果形参有默认值,会对参数的类型进行说明,类型说明只有提示功能没有限制功能。
a. 给参数设定默认值,默认值的类型就是参数的类型
b. 在形参的后面加 :类型名 来说明参数类型,这种方式调用时还是必须进行传参操作。
如果一个参数给了默认值,就不能用:进行类型说明了
c. 函数声明的时候在括号后面加 -> 返回值 来说明函数返回的类型
类型说明的好处:a.对实参的类型进行指导 b.实现函数相关功能的时候,有类型相关的语法提示。

4.不定长参数:

函数的参数个数不确定:
声明函数的时候在参数名前加 * 可以用来同时获取多个实参的值
--实际上是将带*的参数编码元祖,将多个实参的值作为元祖的元素
注意:
如果一个函数的参数既有不定长参数又有普通参数,那么不定长参数必须放在普通参数的后边。

def ly_sum(*nums):
    print(nums)


ly_sum(1)
ly_sum(1, 2)
ly_sum(1, 2, 3)
ly_sum()

b.在参数名前面加 **
会将这个参数变成一个字典来关键字参数的值,其他关键字作为key,实参作为value
一般一起使用,一定要放在的后边。

# 定义一个函数,计算多个数的和
def ly_sum(*num1,**num2):
    sum1 = 0
    for num in num1:
        sum1 += sum1
    for num1 in num2:
        sum1 += sum1
    print(sum1)


ly_sum(1, 2, 3, a = 3)

返回值

1.什么是返回值?

返回值就是调用表达式的值,就是ruturn关键字后面的表达式的值
Python中每个函数都有返回值,默认是None
函数调用表达式:--调用函数的语句
return: --关键字,只能写在函数体中。
功能:
1.确定函数的返回值
2.当执行函数的时候如果遇到return,函数直接结束,并且将return后面的值作为函数的返回值。

函数调用过程:

回到函数声明的位置
传参 - (保证每个参数都有值)
执行函数体
执行完函数确定返回值 - 如果执行过程中没有遇到return,函数的返回值是None
如果执行过程中遇到了return, return后面是什么返回值就是什么
回到函数调用的位置(这个时候函数调用表达式的值就是函数的返回值)

def func1():
    print('.....')
    return 100


result = func1()    # func1()就是函数调用表达式。
print(result)

2.多个返回值:

能否有多个返回值,就看这门语言是否支持元祖
return 值1,值2,值3 <==>return(值1,值2,值3)



def func2():
    return 1, 2, 3


n = func2()
print(n)

3.如何确定是否需要返回值

实现函数的功能如果会产生新的数据,就将这个数据用return返回。

def yt_sum(num1, num2):
    # print(num1 + num2)
    return num2+num1


result = yt_sum(10 , 2823)
print(result)
print(result+100)
list1 = [result]
print(list1)

匿名函数

python 使用 lambda 来创建匿名函数。
所谓匿名,意即不再使用 def 语句这样标准的形式定义一个函数。
lambda 只是一个表达式,函数体比 def 简单很多。
lambda的主体是一个表达式,而不是一个代码块。仅仅能在lambda表达式中封装有限的逻辑进去。
lambda 函数拥有自己的命名空间,且不能访问自己参数列表之外或全局命名空间里的参数。
虽然lambda函数看起来只能写一行,却不等同于C或C++的内联函数,后者的目的是调用小函数时不占用栈内存从而增加运行效率。

global 和 nonlocal关键字

当内部作用域想修改外部作用域的变量时,就要用到global和nonlocal关键字了。

全局变量和局部变量

定义在函数内部的变量拥有一个局部作用域,定义在函数外的拥有全局作用域。
局部变量只能在其被声明的函数内部访问,而全局变量可以在整个程序范围内访问。调用函数时,所有在函数内声明的变量名称都将被加入到作用

你可能感兴趣的:(Day9函数)