10、函数

一 为何使用函数

没有函数会有什么问题?

1.无组织无结构,代码冗余2.可读性差3.无法统一管理且维护成本高

总结使用函数的好处:

1.代码重用

2.保持一致性,易维护

3.可扩展性

二 函数的分类

在python中函数分两类:内置函数,自定义函数

 1 #内置函数
 2 # sum
 3 # max
 4 # min
 5 #
 6 # a=len(‘hello‘)
 7 # print(a)
 8 #
 9 # b=max([1,2,3])
10 # print(b)
 1 #自定义函数
 2
 3 # # ******
 4 # # ******
 5 # # ******
 6 # # hello world
 7 # # ******
 8 # # ******
 9 # # ******
10 #
11 def print_star():
12     print(‘#‘*6)
13
14 def print_msg():
15     print(‘hello world‘)
16
17 print_star()
18 print_star()
19 print_star()
20 print_msg()
21 print_star()
22 print_star()
23 print_star()

三 函数的返回值

3.1 返回值的定义

1 def foo():
2      print(‘from foo‘)
3      return None
4  res=foo()
5  print(res)
PS‘‘‘以三种情况返回值都为None:没有returnreturn 什么都不写return None‘‘‘
1 def foo():
2     print(‘from foo‘)
3     x=1
4     return x
5 res=foo()
6 print(res)

3.2 return 一个值 函数调用返回的结果就是这个值

1 def foo():
2     print(‘from foo‘)
3     x=1
4     return 1,[2,3],(4,5),{}
5 res=foo()
6 print(res) #打印结果:(1,[2,3],(4,5),{})
7 a,b,c,d=foo()
8 print(d)

3.3 return 值1,值2,值3,... 返回结果:(值1,值2,值3,...)

1 t=(1,2,3)
2 a,_,_=t
3 print(a)
4
5 t=(1,2,3,4,5,6,7,8,9)
6 a,*_,c=t
7 print(a)
8 print(c)

四 自定义函数详解

4.1 为什么要定义函数?:先定义后使用,如果没有定义而直接使用,就相当于引用了一个不存在的变量名

1 foo()
2 def foo():
3     print(‘from foo‘)
4 print(foo)
5
6 #错误的方式

4.2 函数的使用包含两个阶段:定义阶段和使用阶段

1 # 语法
2 # def 函数名(参数1,参数2,...):
3 #     """文档注释"""
4 #     函数体
5 #     return 值
6
7 # x=len(‘hello‘)
8 # print(x)

4.3 定义函数的三种形式

1、无参数函数:如果函数的功能仅仅只是执行一些操作而已,就定义成无参函数,无参函数通常都有返回值 1 def print_star(): 2 print(‘#‘*6) 

2、定义有参函数:函数的功能的执行依赖于外部传入的参数,有参函数通常都有返回值 1 def my_max(x,y): 2 res=x if x >y else y 3 return res 
 1 # 三元表达式
 2 x=10
 3 y=2
 4 # if x > y:
 5 #     print(x)
 6 # else:
 7 #     print(y)
 8 #
 9 # res=x if x > y else y
10 # print(res)
3、空函数
 1 # def auth():
 2 #     """认证功能"""
 3 #     pass
 4 # auth()
 5 def insert():
 6     """插入功能"""
 7     pass
 8 def select():
 9     """查询功能"""
10     pass
11 def delete():
12     """删除功能"""
13     pass
14 def update():
15     """更新功能"""
16     pass

五 调用函数

 1 def foo():
 2     print(‘from foo‘)
 3
 4 def bar(name):
 5     print(‘bar===>‘,name)
 6
 7 #按照有参和无参可以将函数调用分两种
 8 foo() #定义时无参,调用时也无需传入参数
 9 bar(‘egon‘) #定义时有参,调用时也必须有参数
10
11
12 #按照函数的调用形式和出现的位置,分三种
13
14 foo() #调用函数的语句形式
15
16 def my_max(x,y):
17     res=x if x >y else y
18     return res
19
20 # res=my_max(1,2)*10000000 #调用函数的表达式形式
21 # print(res)
22
23
24 res=my_max(my_max(10,20),30) #把函数调用当中另外一个函数的参数
25 print(res)

六 函数参数

6.1 从大的角度去看,函数的参数分两种:形参(变量名),实参(值)

1 #定义阶段
2 # def foo(x,y): #x=1,y=2
3 #     print(x)
4 #     print(y)
5
6 #调用阶段
7 # foo(1,2)

6.2 详细的区分函数的参数分为五种:

# 位置参数,关键字参数,默认参数,可变长参数(*args,**kwargs),命名关键字参数1)位置参数
1 # def foo(x,y,z):#位置形参:必须被传值的参数
2 #     print(x,y,z)
3 #
4 # # foo(1,2,3)
5 # foo(1,2,3) #位置实参数:与形参一一对应

2)关键字参数:key=value

 1 def foo(x,y,z):
 2     print(x,y,z)
 3
 4 # foo(z=3,x=1,y=2)
 5
 6 #关键字参数需要注意的问题:
 7 # 1:关键字实参必须在位置实参后面
 8 # 2: 不能重复对一个形参数传值
 9 # foo(1,z=3,y=2) #正确
10 # foo(x=1,2,z=3) #错误
11
12 # foo(1,x=1,y=2,z=3)

3)默认参数

 1 # def register(name,age,sex=‘male‘): #形参:默认参数
 2 #     print(name,age,sex)
 3 #
 4 # register(‘asb‘,age=40)
 5 # register(‘a1sb‘,39)
 6 # register(‘a2sb‘,30)
 7 # register(‘a3sb‘,29)
 8 #
 9 # register(‘钢蛋‘,20,‘female‘)
10 # register(‘钢蛋‘,sex=‘female‘,age=19)
11
12 #默认参数需要注意的问题:
13 #一:默认参数必须跟在非默认参数后
14 # def register(sex=‘male‘,name,age): #在定义阶段就会报错
15 #     print(name,age,sex)
16
17 #(了解)二:默认参数在定义阶段就已经赋值了,而且只在定义阶段赋值一次
18 # a=100000000
19 # def foo(x,y=a):
20 #     print(x,y)
21 # a=0
22 # foo(1)
23
24 #三:默认参数的值通常定义成不可变类型

4)可变长参数

 1 def foo(x,y,*args): #*会把溢出的按位置定义的实参都接收,以元组的形式赋值给args
 2     print(x,y)
 3     print(args)
 4 #
 5 # foo(1,2,3,4,5)
 6
 7
 8 # def add(*args):
 9 #     res=0
10 #     for i in args:
11 #         res+=i
12 #     return res
13 # print(add(1,2,3,4))
14 # print(add(1,2))
15
16
17
18 # def foo(x, y, **kwargs):  # **会把溢出的按关键字定义的实参都接收,以字典的形式赋值给kwargs
19 #     print(x, y)
20 #     print(kwargs)
21 # foo(1,2,a=1,name=‘egon‘,age=18)

示例:

 1 def foo(name,age,**kwargs):
 2     print(name,age)
 3     if ‘sex‘ in kwargs:
 4         print(kwargs[‘sex‘])
 5     if ‘height‘ in kwargs:
 6         print(kwargs[‘height‘])
 7
 8 foo(‘egon‘,18,sex=‘male‘,height=‘185‘)
 9 foo(‘egon‘,18,sex=‘male‘)
10
11
12 命名关键字参数(了解)
13
14 def foo(name,age,*,sex=‘male‘,height):
15     print(name,age)
16     print(sex)
17     print(height)
18 #*后定义的参数为命名关键字参数,这类参数,必须被传值,而且必须以关键字实参的形式去传值
19 foo(‘egon‘,17,height=‘185‘)
20
21
22
23 def foo(name,age=10,*args,sex=‘male‘,height,**kwargs):
24 def foo(name,age=10,*args,sex=‘male‘,height,**kwargs):
25     print(name)
26     print(age)
27     print(args)
28     print(sex)
29     print(height)
30     print(kwargs)
31
32 foo(‘alex‘,1,2,3,4,5,sex=‘female‘,height=‘150‘,a=1,b=2,c=3)
33
34
35 def foo(*args):
36     print(args)
37
38 foo(1,2,3,4) # 1,2,3,4 <=====>*(1,2,3,4)
39
40 *[‘A‘,‘B‘,‘C‘,‘D‘],=====>‘A‘,‘B‘,‘C‘,‘D‘
41 foo(*[‘A‘,‘B‘,‘C‘,‘D‘]) #foo(‘A‘,‘B‘,‘C‘,‘D‘)
42 foo([‘A‘,‘B‘,‘C‘,‘D‘]) #
43
44 def foo(x,y,z):
45     print(x,y,z)
46
47 # foo(*[1,2,3]) #foo(1,2,3)
48 foo(*[1,2]) #foo(1,2)
49
50
51 def foo(**kwargs):
52     print(kwargs)
53
54 #x=1,y=2  <====>**{‘y‘: 2, ‘x‘: 1}
55 # foo(x=1,y=2)
56
57 foo(**{‘y‘: 2, ‘x‘: 1,‘a‘:1}) #foo(a=1,y=2,x=1)
58
59 def foo(x,y,z):
60     print(x,y,z)
61
62 # foo(**{‘z‘:3,‘x‘:1,‘y‘:2}) #foo(x=1,z=3,y=2)
63 foo(**{‘z‘:3,‘x‘:1}) #foo(x=1,z=3)
64
65
66 def foo(x,y,z):
67     print(‘from foo‘,x,y,z)
68
69 def wrapper(*args,**kwargs):
70     print(args)
71     print(kwargs)
72
73
74 wrapper(1,2,3,a=1,b=2)
75
76
77
78 def foo(x,y,z):
79     print(‘from foo‘,x,y,z)
80 def wrapper(*args,**kwargs):
81     print(args) #args=(1,2,3)
82     print(kwargs) #kwargs={‘a‘:1,‘b‘:2}
83     foo(*args,**kwargs) #foo(*(1,2,3),**{‘a‘:1,‘b‘:2}) #foo(1,2,3,b=2,a=1)
84 # wrapper(1,2,3,a=1,b=2)
85 wrapper(1,z=2,y=3)
86
87
88
89 def foo(x,y,z):
90     print(‘from foo‘,x,y,z)
91 def wrapper(*args,**kwargs):
92     # print(args) #args=(1,)
93     # print(kwargs) #kwargs={‘y‘:3,‘z‘:2}
94     foo(*args,**kwargs) #foo(*(1,),**{‘y‘:3,‘z‘:2}) #foo(1,z=2,y=3)
95 # wrapper(1,2,3,a=1,b=2)
96 wrapper(1,z=2,y=3)

PS:注意

1 #补充:函数定义阶段到底干了什么事情:只检测函数体的语法,并不会执行
2 # def bar():
3 #     x
4 #     if 1 >2:
5 #           print(‘====>‘)
6 #
7 # bar()
				
时间: 2024-12-12 22:57:45

10、函数的相关文章

C++学习笔记(10)函数

一.函数操作 1 #include "stdafx.h" 2 #include<iostream> 3 #include<string> 4 using std::cout; 5 using std::cin; 6 using std::endl; 7 using std::string; 8 int fact(int);//如果没有这句话会提示找不到标识符,也可以把fact函数放在main函数前面 9 int _tmain(int argc, _TCHAR*

从零开始的Python学习Episode 10——函数

函数 一.函数的创建 简单格式 def function_name(参数表): 函数体 return 如果没有写return,函数会默认返回一个none 二.函数的参数 必需参数: 调用函数时必需参数须以正确的顺序传入,调用的数量必须和声明时的一样. def func1(name,age): print('my name is %s,i am %d years old'%(name,age)) func1('smilepup',20) #输出my name is smilepup,i am 20

10 函数指针 回调函数

?.函数指针定义 ?.函数回调 三.动态排序 四.函数返回值是函数指针

python 基础篇 10 函数进阶

本节主要内容:1. 函数参数--动态传参2. 名称空间, 局部名称空间, 全局名称空间, 作?域, 加载顺序.3. 函数的嵌套4. gloabal, nonlocal关键字 ?. 函数参数--动态传参之前我们说过了传参, 如果我们需要给?个函数传参, ?参数?是不确定的. 或者我给?个函数传很多参数, 我的形参就要写很多, 很?烦, 怎么办呢. 我们可以考虑使?动态参数.形参的第三种: 动态参数动态参数分成两种 ::: 1--->>>动态接收位置参数 首先,先回顾依稀位置参数: 注意:动

10 函数进阶 动态传参 作用域和名称空间 函数的嵌套 全局变量

今日主要内容 1. 动态传参(重点) *, ** *, ** : 形参: 聚合 位置参数* -> 元组 关键字** -> 字典 实参: 打散 列表, 字符串, 元素 -> * 字典 -> ** 形参顺序(重点): 位置, *args, 默认值, **kwargs 无敌传参 def func(*args, **kwargs): arguments参数 keyword-arguments关键字参数 pass 2. 作用域和名称空间 名称空间: 用来存放名字(变量, 函数名, 类名, 引

第10天:apply和call、bind、函数作为参数、返回值使用、闭包、递归的样例

apply和call apply和call都可以改变this的指向 函数的调用,改变this的指向 函数名字.apply(对象,[参数1,参数2,.....]) 方法名字.apply(对象,[参数1,参数2,.....]) 方法名字.call(对象,参数1,参数2,.....) 方法名字.call(对象,参数1,参数2,.....) 不同的地方:参数传递是方式不一样 只要是想使用别的对象的方法,并且希望这个方法是当前对象的,那么久可以使用apply或者call的方法改变this的指向 apply

Delphi常用系统函数总结

字符串处理函数 Unit System 函数原型 function Concat(s1 [, s2,..., sn]: string): string; 说明 与 S := S1 + S2 + S3 ...; 相同. 将字符串相加. 函数原型 function Copy(S: string; Index, Count: Integer): string;说明 S : 字符串. Indexd : 从第几位开始拷贝. Count : 总共要拷贝几位. 从母字符串拷贝至另一个字符串. 函数原型 pro

python函数简介

函数的基础概念 函数是python为了代码最大程度地重用和最小代码冗余而提供的基本数据结构. 函数是一种设计工具,可能将复杂的程序,分解成可以管理的块. 在python中可以创建四种函数: 全局函数:定义在模块中 局部函数:嵌套在其他函数中 lambda函数:表达式 方法:与特定数据类型关联的函数,并且只能与数据类型关联一起使用. 创建函数 语法 def functionName(parameters) suite 函数的调用形式: 语句形式: func() 表达式形式: res = func2

C语言函数、函数指针解析

函数.函数指针的理解: 函数的定义: void myfunc(void) { } 函数的声明 void myfunc(void); 函数指针的定义.初始化.赋值: 定义:void (*funcp)(void); 初始化: void (*funcp)(void) = &myfunc; 赋值 void (*funcp)(void); funcp = &myfunc; 函数调用:(*funcp)(); funcp(); 也可以这样赋值:void (*funcp)(void); funcp = m

Linux中的shell脚本编程——函数

概述: 本章节将总结while,for循环语句的特殊用法,在不同的场景当中,更能发挥其功能和价值.除此之外,还会介绍一种特殊的循环语句select语句,实现菜单的作用.最重要的是讲解shell脚本编程中函数的用法.这些内容都要熟练掌握. 一.循环语句的特殊用法: 1.while循环的特殊用法(遍历文件的每一行): □语法:while read line; do 循环体 done < /PATH/FROM/SOMEFILE □意义:依次读取/PATH/FROM/SOMEFILE文件中的每一行,且将