python函数

一、函数

1.函数的定义

a.定义
  • 函数就是对实现某一特定功能的代码段的封装
b.分类
  • 函数可以分为内置函数和自定义函数
  • 内置函数:python已经声明好了。程序员直接调用的函数。print函数 input函数等
    相当于已经造好的机器,程序员只需要知道机器的功能和使用方法
  • 自定义函数:程序员自己声明,自己实现功能的函数,可以提供给别人使用,也可以自己用
    相当于自己设计和创建机器。

2.函数的声明

a.语法
  • def 函数名(形参列表):
    函数说明文档
    函数体
b.说明:

**def **- 是python中声明函数的关键字

**函数名 **- 自己命名的 要求:标识符,不能是关键字
PEP8 名字当中的字母小写,多个单词之间用下划线隔开
见名知意(看到函数名大概知道函数的功能)

**() **- 固定写法

形参列表 - 形参1,形参2,... (可以有一个函数,也可以有多个参数,也可以没有参数)
形参作用:从函数的外部向函数内部传值

- 固定写法

函数说明文档 - 用来对函数功能进行说明的注释 这个注释需要使用三个双引号引起来
函数体 - 实现函数功能的代码段

c.函数声明的过程

第一步:确定函数功能
第二步:根据函数功能,确定函数名
第三步:确定参数,看实现函数的功能,需不需要额外的数据,需要几个数据,就需要几个参数
第四步:实现函数的功能
第五步:确定返回值

#声明一个函数,求两个函数的和并打印
def my_sum(num1,num2):
    print(num1 + num2)
my_sum(10,20)

#打印10个*
def print_star():
    print('*'*10)
print_star()

#声明一个函数,求1+2+3+4+...+n
def n_sum(n):
    sum1 = 0
    for i in range(n+1):
        sum1 += i
    print(sum1)
n_sum(4)

3.函数的调用

  • (重点)函数的在声明的时候不会执行函数体,只有再调用的时候才会执行
a.语法:

函数名(实参列表)

b.说明:

函数名 - 必须是已经声明过的函数
() - 固定写法
实参列表 - 用来给形参赋值(需要传递给函数内部的数据)
目前 形参有多少个,实参就需要多少个

my_sum(10,20)
n_sum(4)

二、函数的调用

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

# def say_hello():
#     print("hello")

1函数的调用过程(重点)

a.物理过程

第一步:回到函数声明的位置
第二步:用实参给形参赋值(传参)
传参一定要保证每个形参都有值
第三步:执行函数体
第四步:获取返回值
第五步:回到函数调用的位置,接着往下执行

b.函数调用的过程就是一个压栈的过程
  • 当函数调用的时候,系统会自动的在内存中栈区间开辟空间,存储函数调用过程中产生的数据
    (这儿的数据包括参数和在函数声明的变量) 当函数调用完成后,对应的内存空间会自动销毁
def say_hello(name):
    print(name,"hello")

print('=======')
say_hello("小米")
say_hello("小花")

a = 10
b = 20
def change(a,b):
    #a = 10  b = 20
    a,b = b,a
    print("函数中:",a,b)
change(a,b)
print("函数外:",a,b)

三、函数的参数

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

a.位置参数:

实参的位置和形参的位置一一对应

def func1(a,b,c):
    #a = 20 b = 5 c = 100
    print("a:%d b:%d c:%d" %(a,b,c))#a:20 b:5 c:100

func1(20,5,100)

a.关键字参数

实参以“形参名=值”的形式来传参

func1(c=100,b=5,a=20)#a:20 b:5 c:100
c.位置参数和关键字参数混合使用

前提是保证每个参数都有值,位置参数一定要在关键字参数前面

func1(100,c=5,b=20)#a:100 b:20 c:5

2.从函数声明的角度又有:参数默认值,不定长参数。参数类型说明

1.参数默认值:

声明函数的时候可以给参数设置默认值,
语法: 参数名 = 默认值

注意:设置参数默认值除了可以给参数一个默认值,更多的时候也可以对参数的类型进行说明

def func2(a=1,b=2,c=3):
    print("a:%d b:%d c:%d" %(a,b,c))

#如果函数声明的时候参数有默认值,调用函数的时候,有默认值的参数可以不用赋值
func2(10,20,30)#a:10 b:20 c:30
func2()#a:1 b:2 c:3
func2(10,20)#a:10 b:20 c:3
func2(b = 20)#a:1 b:20 c:3

#如果有的参数有默认值,有的参数没有默认值,有默认值的参数一定要放到没有默认值参数的后面
def func3(a,b,c=3):
    print("a:%d b:%d c:%d" % (a, b, c))


func3(10,20,30)#a:10 b:20 c:30
func3(10,20)#a:10 b:20 c:3
func3(a = 10,b = 20)#a:10 b:20 c:3

3.不定长参数

  • 不定长参数:声明函数的时候函数的参数不确定
a.在声明函数的时候,在参数名前加一个“*”,会将这个参数变成元祖来获取多个实参的值(位置参数传参)
#声明一个函数,球多个数的和、
def sum_num(*num):
    print(sum(num))
  • 调用参数是不定长参数的函数的时候,不定长参数对应的位置,可以传任意个实参
sum_num(1,5,3)


def func4(name,*scores):
    print(name,scores)

func4("小明",55,66,55)

a.在声明函数的时候,在参数名前加两个“*”,会将这个参数变成字典来获取多个实参的值(关键字参数传参)
def func5(**kwargs):
    print(kwargs)
  • 如果是调用不定长关键字参数(参数名前家了两个*),调用的时候关键字可以随便命名
func5(a=1,b=2,c=3)

def func6(a,**kwargs):
    print(a,kwargs)

func6('das',x=4,b=5)

c.一颗和两颗一起使用 - 用来表示不定长参数。调用的时候可以不传参,也可以用关键字传参或者位置传参,也可以两个一起用

要求:一颗的参数要放在两颗的前面

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

func7()#() {}
func7(4,5,6,7)#(4, 5, 6, 7) {}
func7(a=1,b=1,c=2)#() {'a': 1, 'b': 1, 'c': 2}
func7(1,2,3,a=1,b=2)#(1, 2, 3) {'a': 1, 'b': 2}


#练习  球多个数的和,要求调用函数的时候可以多样性(位置,关键字可以一起)
def my_sum(*args,**kwargs):
    sum1 = sum(args)
    sum2 =sum(kwargs.values())
    print(sum1 + sum2)
my_sum(1,2,3,a=2,b=3)


def my_sum1(*args,**kwargs):
    sum3 = 0
    #获取所有位置参数
    for item in args:
        sum3 += item
    #获取关键字参数
    for key in kwargs:
        sum3 += kwargs[key]
    print(sum3)
my_sum1(1,2,3,a=2,b=3)

4.参数类型说明

  • 参数类型说明,只是对参数类型进行提示,不能限制参数类型

  • 说明方式:
    a.设置默认值
    b.参数名:类型名

  • 注意:类型说明除了说明类型以外,还可以做相应类型对应的语法提

def func8(a:int,b:'',c:list):
    c.append('3')
    print(a,b,c)

func8(10,'ac',[1,2])

四、函数的返回值

1.返回值

a.函数的返回值就是return关键字后面表达式的值,就是函数调用表达式的值
b.python中所有的函数都有返回值,默认是None
  • return - 关键字,返回返回值,结束函数(当函数执行中遇到return函数直接结束)
    如果函数体中没有return,函数会在函数体执行结束时将None作为返回值

  • 函数调用表达式 - 调用函数的语句;当函数调用完成后,函数调用表达式的结果就是函数的返回值

  • 作用:就是将在函数内部产生的数据,传递到函数的外面。防止在函数调用完成后被销毁

  • 什么时候使用返回值:如果实现函数的功能会产生新的数据,一般都会将这个数据返回

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

def func2(m,n):
    return m+n  #m+n的结果就是返回值

def func3(m,n):
    return None  #None作为返回值,在这结束函数,函数体后面的其他语句不会执行
    print(m,n)

def func4(m):
    if m % 2 ==0:
        return '偶数'

str1 = func4(10) #func4(10) = '偶数'
print(func4(10),str1,len(str1)) #偶数 偶数 2
print(func4(11)) #None
  • 看一个函数的返回值,永远只看是否遇到return,遇到就是return后面的值,遇不到就None

2.同时返回多个值

  • python的函数中支持返回多个值
    return 返回值1,返回值2,返回值3...(实质是以元祖的形式返回)
#写一个函数,求多个数的和 以及 平均值
def func5(*num):
    sum1 = sum(num)
    avg1 = sum(num)/len(num)
    return sum1,avg1


sum1,avg1 = func5(1,2,3)
print(func5(1,2,3))
print(sum1,avg1)

五、返回值的应用

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

1用函数调用表达式给变量赋值

def func1():
    return 'hello'

#str1 = 'hello'
str1 = func1()
print(str1)

2.通过函数调用表达式,使用相应的方法

def func2():
    return [1,2]

item = func2()[0]
print(item)

item = func2().append(3) #获取的是append函数的返回值,append函数没有返回值所以是None
print(item)#None

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

3.将函数调用表达式作为容器的元素或者作为函数的参数以及函数的返回值

def func3():
    print('hello')
    return 100

#作为值参加运算
print(func3()+3) #print(100+3)

#作为列表元素
list2 = [func3(),'abc']
print('list2:',list2)# list2: [100, 'abc']

#作为字典的key和value
dict1 = {func3():func3()}
print(dict1)

六、匿名函数

  • 匿名函数还是函数,除了声明的语法外,函数其他的语法都适用于匿名函数

1.匿名函数的声明

a.语法
  • 函数名 = lambda 参数列表:返回值
b.说明

函数名= 变量名
lambda - 关键字
参数列表 - 和普通函数的参数列表的作用一样
返回值 - 相当于普通函数的return关键字后面的表达式

  • 注意:匿名函数中 冒号后面的语句属于函数体,在声明的时候不会执行
    匿名函数的调用和普通函数一模一样
#用匿名函数球两个数的和
my_sum1 = lambda n,m : n+m

my_sum1(3,4)
print(my_sum1(3,4)) # 7
print(my_sum1(n=5,m=4)) #  9

#练习  些匿名函数 球两个数中的最大值
my_max = lambda a,b :max(a,b)
my_max(3,5)
print(my_max(7,5))

my_max = lambda x,y : x if x > y else y

my_max(3,5)
print(my_max(7,5))

补充:python中的三目运算符

a.

C中的三目运算符:条件语句?值1:值2 - 条件语句为True,整个表达式的结果是值1,否则就是值2

int x = 10, y = 20
max = x>y?x:y
b.

python中的三目运算符: 值1 if 条件语句 else 值2 - 条件语句为True,整个表达式的结果是值1,否则就是值2

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


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


最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,254评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,875评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,682评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,896评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,015评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,152评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,208评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,962评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,388评论 1 304
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,700评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,867评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,551评论 4 335
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,186评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,901评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,142评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,689评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,757评论 2 351

推荐阅读更多精彩内容