【2020Python修炼记15】Python语法入门—函数的基本使用

【目录】

一、什么是函数

二、为何要有函数

三、如何使用函数

(一)定义函数

(二)调用函数

(三)函数返回值

一、什么是函数

为了方便重复使用某些需要的代码功能,因此创造了很多代码工具,给它们命名为‘函数’。 

在程序中,具备某一功能的‘工具’——函数

                  ‘事先准备工具’的过程——函数的定义

                  ‘拿来就用’——函数的调用

 

函数的分类:

#1、内置函数
为了方便我们的开发,针对一些简单的功能,python解释器已经为我们定义好了的函数,即内置函数。

对于内置函数,我们可以拿来就用而无需事先定义,如 len(),sum(),max()

#2、自定义函数
很明显内置函数所能提供的功能是有限的,这就需要我们自己根据需求,事先定制好我们自己的函数来实现某种功能,

以后,在遇到应用场景时,调用自定义的函数即可。

二、为何要有函数

为了解决以下程序代码问题:

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

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

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

 

三、如何使用函数

函数的使用分为定义阶段调用阶段,

定义函数时只检测语法,不执行函数体代码,

函数名加括号即函数调用,只有调用函数时才会执行函数体代码

 

定义函数发生的事情

1、申请内存空间保存函数体代码

2、将上述内存地址绑定函数名

3、定义函数不会执行函数体代码,但是会检测函数体语法

调用函数发生的事情

1、通过函数名找到函数的内存地址——print(func)

2、然后加括号就是在触发函数体代码的执行 ——func()

 

(一)定义函数——三种方式

 

函数的使用必须遵循’先定义,后调用’的原则。

函数的定义就相当于 事先将函数体代码保存起来,然后将内存地址赋值给函数名,函数名就是对这段代码的引用,这和变量的定义是相似的。没有事先定义函数而直接调用,就相当于在引用一个不存在的’变量名’。

 

def 函数名(参数1,参数2,...):
    """文档描述"""
    函数体
    return
  •  def: 定义函数的关键字;
  • 函数名:函数名指向函数内存地址,是对函数体代码的引用。函数的命名应该反映出函数的功能;
  • 括号:括号内定义参数,参数是可有可无的,且无需指定参数的类型;
  • 冒号:括号后要加冒号,然后在下一行开始缩进编写函数体的代码;
  • """文档描述"""  描述函数功能,参数介绍等信息的文档,非必要,但是建议加上,从而增强函数的可读性;
  • 函数体:由语句和:达式组成;
  • return 值:定义函数的返回值,return是可有可无的。

1、方式一:无参函数

 # 示范1——先定义函数,后调用函数

def bar(): #定义函数 bar(), bar=函数的内存地址
    print('from bar')

def foo():
    # print(bar) # 输出的是函数的内存地址 <function bar at 0x0000021D5885A0D0>
    bar() #调用函数bar()
    print('from foo')

foo() #调用函数foo()

 # 示范2——定义函数的部分,放在调用语句之后,但是在调用函数执行之前

def foo():
    bar() #此处还未调用函数bar(),只是判断是否有语法错误
    print('from foo')
# 定义函数 bar()
def bar():  # bar=函数的内存地址
    print('from bar')

foo() #调用函数bar()

# 示范3———定义函数的部分,放在调用语句之后,且在调用函数执行之后,此时会出错哦

def foo():
    # print(bar)
    bar()
    print('from foo')

foo()

def bar():  # bar=函数的内存地址
    print('from bar')
    

NameError: name 'bar' is not defined


2、方式二:有参函数——参数是函数的调用者向函数体传值的媒介

函数——工厂

参数——原材料

返回值——产品

def my_min(x,y):
    res=x if x < y else y
    return res

 

3、方式三:空函数——函数体代码为 pass,代表什么都不做

定义空函数通常是有用的,因为在程序设计的开始,往往是先想好程序都需要完成什么功能,

然后把所有功能都列举出来用pass充当函数体“占位符”,这将使得程序的体系结构立见,清晰且可读性强。

之后我们便可以统筹安排编程任务,有选择性的去实现函数体功能来替换掉pass,从而提高开发效率。

 

栗子】:编写一个ftp程序,我们可能想到的功能有用户认证,下载,上传,浏览,切换目录等功能,可以先做出如下定义,再有选择性地实现函数体代码——

           

def auth_user():
    """user authentication function"""
    pass

def download_file():
    """download file function"""
    pass

def upload_file():
    """upload file function"""
    pass

def ls():
    """list contents function"""
    pass

def cd():
    """change directory"""
    pass

 

4、三种定义函数方式的使用场景:

(1)无参函数

def interactive():
    name=input('username>>: ')
    age=input('age>>: ')
    gender=input('gender>>: ')
    msg='名字:{} 年龄:{} 性别'.format(name,age,gender)
    print(msg)

interactive()
interactive()
interactive()
interactive()

 

(2)有参函数

def add(x,y): # 参数-》原材料
    # x=20
    # y=30
    res=x + y
    # print(res)
    return res # 返回值-》产品

# add(10,2)
res=add(20,30)
print(res)

 

(3)空函数

参考上一小节内容中的【栗子】——编写一个ftp程序 

 

(二)调用函数——

按照在程序出现的形式和位置,可将函数的调用形式分为三种:

1、语句的形式:只加括号调用函数

interactive()
add(1,2)

 

2、表达式形式

def add(x,y): # 参数-》原材料
    res=x + y
    return res # 返回值-》产品
赋值表达式
res=add(1,2)
print(res)
数学表达式
res=add(1,2)*10
print(res)

 

3、函数调用可以当做参数

res=add(add(1,2),10)
print(res)

 

(三)函数返回值

1、return

#若需要将函数体代码执行的结果返回给调用者,则需要用到return。

#return的返回值无类型限制,且可以将多个返回值放到一个元组内。

# return是函数结束的标志,即函数体代码一旦运行到 return,会立刻终止函数的运行;

函数内可以有多个return,但只执行一次函数就结束了,并且会将 return后的值当做本次运行的结果返回。

#PS:

结束程序的执行的力度:

exit > return > break > 条件为假

(1)返回None:函数体内的return后无值或直接省略return,则默认返回none

return
return None


def
func(): pass res=func() print(res) # 返回值None


(2)有return,返回一个值

def func():
    return (10)
res=func()
print(res) # 返回值为10


(3)有return,返回多个值——逗号分隔开多个值,默认返回元祖

def func():
    return (10,'cc',[1,2])
res=func()
print(res,type(res)) # 返回值为元祖(10, 'cc', [1, 2])

 

 

参考资料:

https://www.cnblogs.com/linhaifeng/articles/7531972.html

https://zhuanlan.zhihu.com/p/108808009

 

posted @ 2020-03-17 15:09  bigorangecc  阅读(310)  评论(0编辑  收藏  举报