第五章 Python 函数

第1章 为什么要使用函数

#1、代码的组织结构不清晰,可读性差

#2、遇到重复的功能只能重复编写实现代码,代码冗余

#3、功能需要扩展时,需要找出所有实现该功能的地方修改之,无法统一管理且维护难度极大

第2章 函数是什么

定义:函数是指将一组语句的集合通过一个名字(函数名)封装起来,要执行这个函数,只需要调用函数名即可。

特性:

1、减少重复代码

2、使程序变的可扩展

3、使程序变得易维护

函数的使用必须遵循:先定义,后调用

2.1
函数的分类

1、 内置函数:python解释器自带的函数,python解释器启动就会定义好这些函数

如len(),sum(),max(),min()

2、自定义函数:开发人员根据需求,定制好自己的函数来实现某种功能,在遇到应用场景时,调用自定义函数即可。

2.2
定义函数语法

def 函数名(参数1,参数2,...)

"""
注释 """

函数体

return 返回值

def = define(定义)

#函数名要能反映其意义

2.3
函数的定义与调用

### 定义一个函数,并且调用

def hello():

print(‘hello word‘)

hello()

>>> hello word

### 函数与变量一样,函数的内容也会占用内存空间

### 打印函数名会返回函数所占的内存空间

def hello():

print(‘hello word‘)

print(hello)

<function hello at 0x000000DD707F3E18>

2.4
函数的使用规则:先定义 再调用

函数即“变量”,“变量”必须先定义后引用。未定义而直接引用函数,就相当于在引用一个不存在的变量名

函数在定义阶段,只检测语法,不执行代码

def foo():

print(‘from foo‘)

bar()  #报错 在定义的时候就已经报语法错误了

foo()

def bar():

print(‘from bar‘)

def foo():

print(‘from foo‘)

bar()

foo() #正常

### 不会报错,因为在定义阶段没有出现语法错误

def foo():

print(‘from foo‘)

bar()

def bar():

print(‘from bar‘)

foo()

#结论:函数的使用,必须遵循原则:先定义,后调用

#我们在使用函数时,一定要明确地区分定义阶段和调用阶段

#定义阶段

def foo():

print(‘from
foo‘)

bar()

def bar():

print(‘from
bar‘)

#调用阶段

foo()

函数在定义阶段都干了哪些事?

只检测语法,不执行代码

也就说,语法错误在函数定义阶段就会检测出来,而代码的逻辑错误只有在执行时才会知道

第3章 定义参数的三种形式

#1、无参:应用场景仅仅只是执行一些操作,比如与用户交互,打印

#2、有参:需要根据外部传进来的参数,才能执行相应的逻辑,比如统计长度,求最大值最小值

#3、空函数:设计代码结构

3.1
无参

def login():

while
True
:

user_name=input(‘user_name>>>: ‘).strip()

if
not
user_name:continue

user_pass=input(‘user_pass>>>:
).strip()

if user_name
== ‘leo‘ and user_pass
== ‘123‘:

print(登录成功‘)

else:

print(登录失败‘)

login()

### 这是一个无参函数,虽然满足逻辑,但是用户名和密码都写死在函数体力,无法灵活使用。

3.2
传参

def main():

while
True
:

name=input(‘name>>>  ‘).strip()

if
not
name:continue

password=input(‘password>>>:
).strip()

if
not
password:continue

res=arth(name,password)

if res:

print(登录成功‘)

else:

print(登录失败‘)

def arth(user,password):

if user
== ‘leo‘ and password
== ‘123‘:

return
True

else:

return
False

main()

3.3
空函数

def
auth(user,password):

‘‘‘

auth function

:param user: 用户名

:param password: 密码

:return: 认证结果

‘‘‘

pass

def
get(filename):

‘‘‘

:param filename:

:return:

‘‘‘

pass

def
put(filename):

‘‘‘

:param filename:

:return:

‘‘‘

def
ls(dirname):

‘‘‘

:param dirname:

:return:

‘‘‘

pass

#程序的体系结构立见

第4章 调用函数

4.1
调用函数

#1 调用函数:函数名(),

#需要注意:先通过名字找到函数的内存地址,然后加括号调用

4.2
函数的返回值

#注意的第一点:

#在调用函数的过程中,一旦执行到return,就会立刻终止函数,并且把return后的结果当做本次调用的返回值返回

#函数体内可以有多个return,但是只能执行一次

def foo():

print(‘111‘)

return 1

print(‘2222‘)

return 2

print(‘3333‘)

return 3

res=foo()

print(函数调用完毕‘,res)

#注意的第二点:

#返回的值,可以是任意类型

#注意的第三点:

#没有return:默认返回None

#可以返回一个值===>值

#可以用逗号分隔,返回多个值===>tuple

def foo():

return None

res=foo()

print(函数调用完毕‘,res,type(res))

>>> 函数调用完毕 None
<class ‘NoneType‘>

4.3 调用函数的三种形式

1 语句形式:foo()

2 表达式形式:3*len(‘hello‘)

3 当中另外一个函数的参数:range(len(‘hello‘))

语句模式:

def foo():

print(‘from foo‘)

return 123

foo()

>>> from foo

def foo():

print(‘from foo‘)

return 123

res=foo()

print(res)

>>> 123

res=foo()*10

print(res)

>>> 1230

第5章 函数的参数

5.1
形参与实参

#形参:在函数定义阶段,括号内定义的参数的称为形参,就相当于变量名

#实参:在函数调用阶段,括号内定义的参数的称为实参,就相当于变量值

#在调用阶段,实参的值会绑定给形参,在调用结束后,解除绑定

5.2
参数的分类

5.2.1
位置参数

1、位置参数:按照从左到右的顺序定义的参数

位置形参:必须被传值的参数

位置实参:按照位置给形参传值,从左到右

def foo(x,y): #x=1,y=2 #形参

print(x,y)

foo(1,2)    #实参

5.2.2
关键字参数

2、关键字参数:按照key=value的形式定义的实参

无需按照位置为形参传值

注意的问题:

1. 关键字实参必须在位置实参后面

2. 对同一个形参不能重复传值

def foo(x,y):

print(x,y)

foo(1,y=20)

5.2.3
默认参数

三:默认参数:在定义函数阶段,已经为形参赋值了,在定义阶段已经赋值,意味着在调用阶段

可以不传值

注意的问题:

1 默认参数的值,只在定义时赋值一次

2 位置形参应该在默认参数的前面

3 默认参数的值应该是不可变类型

def foo(x,y=10):

print(x,y)

foo(x=1)

>>> 1 10

def foo(x,y,z=10):

print(x,y,z)

foo(x=1,y=2)

>>> 1 2 10

位置参数 > 关键字参数 > 默认参数

### 如果实参在调用阶段传参,那么将使用传参而不使用默认参数,但是不建议这么用

def register(name,age,sex=‘male‘):

print(name,age,sex)

register(‘egon‘,18)

register(‘wsb‘,18)

register(‘alex‘,38,‘xxxxxx‘)

>>> egon 18 male

>>> wsb 18 male

>>> alex 38 xxxxxx

### 只在定义的时候赋值一次,赋值完成后,再赋值将不改变默认参数

x=‘123‘

x=‘456‘

def register(name,age,sex=x):

print(name,age,sex)

x=‘female‘

register(‘alex‘,18)

>>> alex 18 456

5.2.4
可变长参数(非固定参数)

四:可变长参数

实参可变长度指的是:实参值的个数是不固定

而实参的定义形式无非两种:1、位置实参,2、关键字实参

针对这两种形式的实参个数不固定,相应的,形参也要有两种解决方案

分别是*args,**kwargs

def func(x,y,z,*args): #args=(4,5,6)

print(x,y,z)

print(args)

func(1,2,3)

>>> 1 2 3

>>> ()

### 情景是加入新参数的时候使用:

def str_register(name,age,country,course,*args):

print(‘------注册学员信息------‘)

print(姓名: %s‘ %(name))

print(年龄: %s‘ %(age))

print(国籍: %s‘ %(country))

print(科目: %s‘ %(course))

print(‘other args‘,args)

str_register(‘leo‘,28,‘CN‘,‘Python‘)

------注册学员信息------

姓名: leo

年龄: 28

国籍: CN

科目: Python

other args ()

### 如果我什么都不传给 其他参数的话 并不会报错,而且会返回来一个空元组

### 如果传值 将会被放到元组中,可从中拿出来

def str_register(name,age,country,course,*args):

print(‘------注册学员信息------‘)

print(姓名: %s‘ %(name))

print(年龄: %s‘ %(age))

print(国籍: %s‘ %(country))

print(科目: %s‘ %(course))

print(‘other args‘,args)

str_register(‘leo‘,28,‘CN‘,‘Python‘,‘stu001‘,10000)

------注册学员信息------

姓名: leo

年龄: 28

国籍: CN

科目: Python

other args (‘stu001‘, 10000)

### 将溢出的参数 放入字典中

### 如果在传参时没有指定名字,那么他就是*args,非固定参数的元组模式

### 如果指定名字了,那么他就是**kwargs,非固定参数的字典模式

def str_register(name,age,country,course,*args,**kwargs):

print(‘------注册学员信息------‘)

print(姓名: %s‘ %(name))

print(年龄: %s‘ %(age))

print(国籍: %s‘ %(country))

print(科目: %s‘ %(course))

print(‘other args‘,args)

print(‘other args‘,kwargs)

str_register(‘leo‘,28,‘CN‘,‘Python‘,10000,stuid=‘stu001‘)

------注册学员信息------

姓名: leo

年龄: 28

国籍: CN

科目: Python

other args (10000,)

other args {‘stuid‘: ‘stu001‘}

比如将来要用到这个参数了,就可以直接用字典方式取值:

def str_register(name,age,country,course,*args,**kwargs):

print(‘------注册学员信息------‘)

print(姓名: %s‘ %(name))

print(年龄: %s‘ %(age))

print(国籍: %s‘ %(country))

print(科目: %s‘ %(course))

print(‘other args‘,args)

print(‘other args‘,kwargs)

print(‘学号:%s‘ %(kwargs[‘stuid‘]))

str_register(‘leo‘,28,‘CN‘,‘Python‘,10000,stuid=‘stu001‘)

------注册学员信息------

姓名: leo

年龄: 28

国籍: CN

科目: Python

other args (10000,)

other args {‘stuid‘: ‘stu001‘}

学号:stu001

def foo(x, y, z):

print(x,
y, z)

foo(**{‘z‘: 1,
‘x‘: 2, ‘y‘: 3})

5.2.5
命名关键字函数

#五:命名关键字参数(了解):

# 形参中,在*后定义的参数称之为命名关键字参数,

# 它的特性是;传值时,必须按照关键字实参的形式传值

def foo(x,y=20,*args,a=1,b):

print(x,y,a,b)

# foo(10,b=3)

foo(10,22,33,44,a=2,b=3)

>>> 10 22 2 3

# 位置参数,默认参数,*args,命名关键字参数,**kwargs

时间: 2024-08-28 10:19:10

第五章 Python 函数的相关文章

第五章 Python函数

函数作用:把一些复杂的代码封装起来,函数一般都是一个功能,用的时候才调用,提高重复利用率和简化程序结构. 5.1 语法 def functionName(parms1, parms2, ...):    code block    return expression 函数以def关键字开头,空格后跟函数名,括号里面是参数,用于传参,函数代码段里面引用. 5.2 函数定义与调用 # 定义函数 >>> def func(): ...   print "Hello world!&qu

第五章 shell函数的定义、执行、传参和递归函数

第五章 shell函数的定义.执行.传参和递归函数 Bash(Bourne Again shell)也支持函数,在编写大型复杂脚本的时候,可以用函数把代码编写成一个一个功能相对独立的代码块,使代码模块块.结构清晰.有效的减少程序的代码量.但是bash shell是一种解释性语言,执行效率没有编译性语言高. shell函数的定义 格式一:( function name() { command sequence (命令序列) } 格式二: name() { command sequence (命令序

第五章 python的函数(2):函数的参数

上一篇我们介绍了python函数的一些定义和基本的构成. 接下来我们介绍下函数的参数. 什么是函数的参数呢? 当我们定义函数的时候,经常会希望函数能够处理我们传入的数据. 这样可以更具有灵活性和通用性. 传给函数数据时,我们就会使用到参数. 参数有两种:形参(形式参数),实参(实际参数). 5.3.1 参数 参数用来把数据传给函数,让函数利用这个数据来执行 参数的特点: 参数可以是多个 严格按照顺序传参数:位置方式传参 定义了几个参数就得传几个 实际参数可以传任意类型 1. 形参和实参 形参-形

Python 五、Python函数

一.函数概述 1.函数的基础概念 函数是python为了代码最大程度地重用和最小化代码冗余而提供的基础程序结构. 函数是一种设计工具,它能让程序员将复杂的系统分解为可管理的部件 函数用于将相关功能打包并参数化 在python中可以创建4种函数: 全局函数:定义在模块中 局部函数:嵌套于其它函数中 lambda(匿名)函数:仅是一个表达式 方法:与特定数据类型关联的函数,并且只能与数据类型关联一起使用 函数和过程的联系:每个Python函数都有一个返回值,默认为None,也可以使用"return

第五章 python中正则表达式的使用

第一节    正则表达式的一些介绍 1)掌握正则表达式的案例 2)写一个小爬虫 3)正则表达式(或RE)是一个小型的.高度专业化的编程语言,(在python中)它内嵌在python中,并通过re模块实现. - 可以为想要匹配的相应字符串集指定规则 - 该字符串集可能包含英文语句.e-mail地址.命令或任何你想搞定的东西 - 可以问诸如“这个字符串匹配该模式吗?” - “在这个字符串中是否有部分匹配该模式呢?” - 你也可以使用RE以各种方式来修改或分割字符串. 4)正则表达式模式被编译成一系列

JavaScript高级程序设计学习笔记第五章--引用类型(函数部分)

四.Function类型: 1.函数定义的方法: 函数声明:function sum (num1, num2) {return num1 + num2;} 函数表达式:var sum = function(num1, num2){return num1 + num2;};//注意有个分号 构造函数的方式:var sum = new Function("num1", "num2", "return num1 + num2");// 2.函数的重复声

第五章 Shell函数与数组

5.1 函数 格式: func() {     command } 示例1: #!/bin/bash func() {     echo "This is a function." } func # bash test.sh This is a function. Shell函数很简单,函数名后跟双括号,再跟双大括号.通过函数名直接调用,不加小括号. 示例2:函数返回值 #!/bin/bash func() {     VAR=$((1+1))     return $VAR     

SQL笔记-第五章,函数

一.数学函数 功能 函数名  用法 绝对值  ABS()    指数  POWER() POWER(FWeight,-0.5)  平方根  SQRT()    求随机数  RAND()    舍入到最大整数  CEILING()    舍入到最小整数  FLOOR()    四舍五入  ROUND(m)    四舍五入  ROUND(m,d)  d是保留的小数位数  正弦  SIN()    余弦  COS ()    反正弦  ASIN()    反余弦  ACOS()    正切  TAN(

五、python函数、装饰器、内置函数、json及模块

一.递归调用 1.一个函数自己调用自己就是递归调用,最多一个函数递归调用自己999次,超过就会出错2.递归必须有一个明确的结束条件3.每次进入更深一层递归时,问题规模相比上次递归都应有所减少4.递归效率不高,少用递归 eg:def test1(): num = int(input('please enter a number:')) if num%2==0:#判断输入的数字是不是偶数 return True #如果是偶数的话,程序就退出了,返回true print('不是偶数请重新输入!') r