Python学习笔记(五)函数和代码复用

Stella981
• 阅读 657

  函数能提高应用的模块性,和代码的重复利用率。在很多高级语言中,都可以使用函数实现多种功能。在之前的学习中,相信你已经知道Python提供了许多内建函数,比如print()。同样,你也可以自己创建函数,这被叫做用户自定义函数,来实现定制的功能。

一、函数的基本使用

1.函数的定义

  函数是一段具有特定功能的、可重用的语句组,用函数名来表示并通过函数名进行功能调用。

  函数能够完成特定功能,与黑盒类似,对函数的实用不需要了解函数内部实现原理,只要了解函数的的输入和输出方式即可。所以说,函数是一种功能抽象。

使用函数有两个目的:降低编程难度和代码重用。所以在编程中的复杂功能可以使用函数实现。

其中,Python使用 def 保留字定义了一个函数,语法如下:

  def <函数名> (<参数列表>):

    <函数体>

    return <返回值列表>
注:当参数类表中有多个参数,默认情况下,参数值和参数名称是按函数声明中定义的顺序匹配起来的。

2.函数的调用过程

程序调用一个函数需执行一下4个步骤:

  (1)调用程序在调用处暂停执行。

  (2)在调用时将实参复制给函数的形参。

  (3)执行函数体语句。

  (4)函数调用结束给出返回值,程序回到调用前的暂停处继续执行。

  从函数的调用过程中,人们引申出了函数式编程这个概念。函数式编程是一种编程范式,常见的编程范式还包括命令式编程和面向对象编程等。函数编程的主要思想是把程序过程通过使用一系列函数能够使代码编写更简洁、更易于理解,是中小规模软件项目中最常见的一种编程方式。

二、函数的参数传递

1.可选参数和可变数量参数、

可选参数  

  在定义函数时,如果有些参数存在默认值,即部分函数不一定需要调用程序输入,可以在定义函数时直接为这些参数指定默认值。当函数被调用时,如果没有传入对应的参数值,则使用函数定义时的默认值替代。例如:

  使用默认参数:

def printf(str, times = 3):
    print(str * times)>>>printf("hello")hellohellohello

  输入参数

def printf(str, times = 3):
    print(str * times)
>>>printf("hello",2)hellohello

可变量参数  

  在函数定义时,也可以设计可变量参数,通过在参数前增加星号(*)实现。带有星号的可变参数只能出现在参数列表的最后。调用时,这些参数被当作元组类型传递到函数中。

例如:

def printf(times,*b):
    print(b*times)
printf(2,1,2,3)
>>>(1, 2, 3, 1, 2, 3)

2.参数的位置和名称传递

   Python中提供了按照形参名称输入实参的方式,例如

  return =  fuc(x1=2, x2=5, x3=8)      #其中参数由函数 fuc 决定

由于调用函数时指定了参数名称,所以参数之间的顺序可以任意调整。

3.函数的返回值

  return语句用来退出函数并将程序返回被调用的位置继续执行。

  同时,函数可以没有return,此时函数并不返回值。函数也可以用return返回多个值,多个值以元组类型保存。

4.函数对变量的作用

  一个程序中的变量包括两类:全局变量和局部变量。全局变量指在函数之外定义的变量,一般没有缩进,在程序执行全过程有效。局部变量指在函数内部使用的变量,仅在函数内部有效,当函数退出时变量将不存在。

其中Python函数对变量的作用遵守如下原则:

(1)简单数据类型变量无论是否与全局变量重名,仅在函数内部创建和使用,函数退出后变量被释放,如有全局同名变量,其值不变。

(2)简单数据类型变量在用 global 保留字声明后,作为全局变量使用,函数退出后该变量保留且值被函数改变。

(3)对于组合数据类型的全局变量,如果在函数内部没有被真实创建的同名变量,则函数内部可以使用并修改全局变量的值。

(4)如果函数内部真实创建了组合数据类型变量,无论是否有同名全局变量,函数仅对局部变量进行操作,函数退出后局部变量被释放,全局变量值不变。

三、代码复用和模块化设计

  函数是程序的一种抽象,它通过封装实现代码复用。可以利用函数对程序进行模块化设计。

  程序由一系列代码组成,如果代码是顺序但无组织的,不仅不利于阅读和理解,也很难进行维护和升级。因此,把代码当成资源的抽象,形成易于理解的结构。

函数是程序的一种基本抽象方式,它将一系列代码组织起来通过命名供其他程序使用。函数封装的直接好处是代码复用,任何其他代码只要输入参数即可调用函数,从而避免相同代码在被调用处重复编写。代码复用产生了另一个好处,当更新函数时,所有被调用处的功能都能被更新。

模块化设计指通过函数或对象的封装功能将程序划分成主程序、子程序和子程序间关系的表达。模块化设计是使用函数和对象设计程序的思考方法,以功能块为基本单位,一般有以下两个基本要求:

  (1)紧耦合:尽可能合理划分功能块,功能块内部耦合紧密。

  (2)松耦合:模块间关系尽可能简单,功能块之间耦合度低。

概括来说,就是模块内部紧耦合、模块之间松耦合

四、函数的递归

1.递归的定义

  函数作为一种代码封装,可以被其他程序调用,当然,也可以被函数内部代码调用。这种函数定义中调用函数自身的方式称为递归

递归的两个关键特征:

(1)存在一个或多个基例(问题的最小规模下的解),基例不需要再次递归,它是确定的表达式。

(2)所有递归要以一个或多个基例结尾。

2.递归的使用方法

实例:阶乘的计算。

def fact(n):
    if n == 0:
        return 1
    else:
        return n * fact(n-1)

n=eval(print())
print(fact(abs(int(n))))

输入:

>>>10
26288800
点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
待兔 待兔
4个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Jacquelyn38 Jacquelyn38
3年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
Stella981 Stella981
3年前
Lua基础(对象)
:和.区别.   stu{id100,name"Tom",age21}成员变量   function stu.toString()成员函数    return stu.id .. stu.name .. stu.age   endprint(stu
Stella981 Stella981
3年前
Python之time模块的时间戳、时间字符串格式化与转换
Python处理时间和时间戳的内置模块就有time,和datetime两个,本文先说time模块。关于时间戳的几个概念时间戳,根据1970年1月1日00:00:00开始按秒计算的偏移量。时间元组(struct_time),包含9个元素。 time.struct_time(tm_y
Stella981 Stella981
3年前
JS 对象数组Array 根据对象object key的值排序sort,很风骚哦
有个js对象数组varary\{id:1,name:"b"},{id:2,name:"b"}\需求是根据name或者id的值来排序,这里有个风骚的函数函数定义:function keysrt(key,desc) {  return function(a,b){    return desc ? ~~(ak
Stella981 Stella981
3年前
HIVE 时间操作函数
日期函数UNIX时间戳转日期函数: from\_unixtime语法:   from\_unixtime(bigint unixtime\, string format\)返回值: string说明: 转化UNIX时间戳(从19700101 00:00:00 UTC到指定时间的秒数)到当前时区的时间格式举例:hive   selec
Wesley13 Wesley13
3年前
PHP中的NOW()函数
是否有一个PHP函数以与MySQL函数NOW()相同的格式返回日期和时间?我知道如何使用date()做到这一点,但是我问是否有一个仅用于此的函数。例如,返回:2009120100:00:001楼使用此功能:functiongetDatetimeNow(){
Python进阶者 Python进阶者
10个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这