第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

函数的定义与调用

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

defhello():

print(‘hello word‘)

hello()

>>> hello word

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

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

defhello():

print(‘hello word‘)

print(hello)

2.4

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

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

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

deffoo():

print(‘from foo‘)

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

foo()

defbar():

print(‘from bar‘)

deffoo():

print(‘from foo‘)

bar()

foo() #正常

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

print(‘from foo‘)

bar()

defbar():

print(‘from bar‘)

foo()

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

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

#定义阶段

def foo():

print(‘from

foo‘)

bar()

def bar():

print(‘from

bar‘)

#调用阶段

foo()

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

只检测语法,不执行代码

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

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

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

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

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

3.1

无参

deflogin():

while

True:

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

if

notuser_name:continueuser_pass=input(‘user_pass>>>:

‘).strip()

ifuser_name

== ‘leo‘ anduser_pass

== ‘123‘:

print(‘登录成功‘)

else:

print(‘登录失败‘)

login()

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

3.2

传参

defmain():

while

True:

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

if

notname:continuepassword=input(‘password>>>:

‘).strip()

if

notpassword:continueres=arth(name,password)

ifres:

print(‘登录成功‘)

else:

print(‘登录失败‘)

defarth(user,password):

ifuser

== ‘leo‘ andpassword

== ‘123‘:

return

True

else:

return

Falsemain()

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,但是只能执行一次

deffoo():

print(‘111‘)

return1

print(‘2222‘)

return2

print(‘3333‘)

return3

res=foo()

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

#注意的第二点:

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

#注意的第三点:

#没有return:默认返回None

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

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

deffoo():

return Noneres=foo()

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

>>> 函数调用完毕 None

4.3 调用函数的三种形式

1 语句形式:foo()

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

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

语句模式:

deffoo():

print(‘from foo‘)

return123

foo()

>>> from foo

deffoo():

print(‘from foo‘)

return123

res=foo()

print(res)

>>> 123res=foo()*10

print(res)

>>> 1230

第5章 函数的参数

5.1

形参与实参

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

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

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

5.2

参数的分类

5.2.1

位置参数

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

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

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

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

print(x,y)

foo(1,2) #实参

5.2.2

关键字参数

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

无需按照位置为形参传值

注意的问题:

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

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

deffoo(x,y):

print(x,y)

foo(1,y=20)

5.2.3

默认参数

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

可以不传值

注意的问题:

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

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

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

deffoo(x,y=10):

print(x,y)

foo(x=1)

>>> 1 10

deffoo(x,y,z=10):

print(x,y,z)

foo(x=1,y=2)

>>> 1 2 10

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

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

defregister(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‘

defregister(name,age,sex=x):

print(name,age,sex)

x=‘female‘register(‘alex‘,18)

>>> alex 18 456

5.2.4

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

四:可变长参数

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

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

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

分别是*args,**kwargs

deffunc(x,y,z,*args): #args=(4,5,6)print(x,y,z)

print(args)

func(1,2,3)

>>> 1 2 3

>>> ()

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

defstr_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 ()

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

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

defstr_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,非固定参数的字典模式

defstr_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‘}

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

defstr_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

deffoo(x, y, z):

print(x,

y, z)

foo(**{‘z‘: 1,

‘x‘: 2, ‘y‘: 3})

5.2.5

命名关键字函数

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

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

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

deffoo(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

原文地址:http://www.cnblogs.com/touchlixiang/p/7580676.html

python123第四章第五题_第五章 Python 函数相关推荐

  1. java程序设计基础_陈国君版第五版_第十一章习题

    java程序设计基础_陈国君版第五版_第十一章习题 /*** 题目:假设某家银行可接受顾客的汇款,每进行一次汇款,便可计算出汇款的总额.现有两名顾客,每人分三次,每次一百元将钱汇入.试编程来模拟顾客的 ...

  2. java程序设计基础_陈国君版第五版_第七章例题

    java程序设计基础_陈国君版第五版_第七章例题 class Cylinder {private double radius;private int height;private double pi ...

  3. java程序设计基础_陈国君版第五版_第五章习题

    java程序设计基础_陈国君版第五版_第五章习题 import java.util.Scanner; public class Main5_1 {public static void main(Str ...

  4. java程序设计基础_陈国君版第五版_第十一章例题

    java程序设计基础_陈国君版第五版_第十一章习题 class MyThread extends Thread { private String who;public MyThread(String ...

  5. java程序设计基础_陈国君版第五版_第五章例题

    java程序设计基础_陈国君版第五版_第五章例题 public class Main5_1 {public static void main(String[] args){int i;int[] a; ...

  6. java程序设计基础_陈国君版第五版_第六章例题

    java程序设计基础_陈国君版第五版_第六章例题 class Cylinder {double radius;int height;double pi = 3.14;void area(){Syste ...

  7. 2022年4月23日第十三届省赛蓝桥杯真题答案_python_第五题_统计未被污染的海域

    第五题如约而至哈,和第六题差不多(但比第六题简单).好!上题目: 题目: 有一片海域划分为N*M个方格,其中有些海域已被污染(用0表示),有些海域没被污染(用1表示).请问这片N*M海域中有几块是没被 ...

  8. JAVA第六章第6题,java第六章例题源代码

    <JavaWeb 程序设计> 练习题参考答案 第一章:Servlet 基础 1.下列选项中属于...由于 PHP 开放源 代码,并且是免费的,所以非常流行,是当今 Internet 上最为 ...

  9. linux孟庆昌第六章课后题_第六章 参数估计-矩估计:通过课后题理解矩估计

    具体思路(一般是求一阶原点矩和一阶中心矩即期望与方差) 根据总体的分布以及概率函数,计算出总体的数学期望与方差,得到总体矩的函数 用样本矩的函数取替换总体矩的函数. 题目一-基础概念题:矩估计的定义 ...

最新文章

  1. tensorflow object_detect 操作步骤
  2. 基于小波和插值的超分辨率图像重建算法
  3. 【学术相关】读研究生,从学会「拒绝」导师开始
  4. k8s示例:RS和Deployment
  5. CSS3特殊图形制作
  6. 乌班图各版本镜像文件下载
  7. 热血江湖群医外挂源代码研究
  8. 国产数据库-达梦数据库
  9. Win10系统中查看是否开启虚拟化
  10. android-实现一个简单的视频弹幕
  11. cd linux制作u盘启动盘,【cdlinux u盘启动】cdlinux制作U盘启动盘详细教程
  12. python 数据填充
  13. JAVA-数据类型与运算符笔记
  14. qrCode二维码生成器
  15. 洛谷P3987 我永远喜欢珂朵莉~ 树状数组+vector(暴力)
  16. 剑指 Offer 51-60
  17. Android4.4 状态栏WiFi图标显示流程
  18. Your CLT does not support macOS 11
  19. Parquet是什么?
  20. h5故障代码_美的空调故障代码h5 看完你就知道了

热门文章

  1. 正则表达式提取网页中的网址
  2. Adobe Audition (AU)安装教程(附Adobe Audition下载地址)
  3. 联通信号服务器,网友吐槽联通信号不好,其实只是地区问题,以后一定会解决...
  4. layuiadmin中,关于工具栏tool中查看功能具体怎么实现的问题
  5. JAVA虚拟机(JVM)划重点 第一章 走近Java
  6. 【pytest】编写、共享及使用 fixture(测试夹具)
  7. Win10 引用的帐户目前已被锁定,可能无法登录
  8. Laravel - 学习/实践
  9. Mysql8.0新特性之详细版本
  10. 带LOG的二维码生成器