python通过封装可以实现代码复用_Python学习笔记(五)函数和代码复用

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

一、函数的基本使用

1.函数的定义

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

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

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

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

def ():

return

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

2.函数的调用过程

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

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

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

(3)执行函数体语句。

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

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

二、函数的参数传递

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

可选参数

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

使用默认参数:

def printf(str, times = 3):print(str * times)

>>>printf("hello")

hello

hello

hello

输入参数

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

hello

hello

可变量参数

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

例如:

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.递归的使用方法

实例:阶乘的计算。

deffact(n):if n ==0:return 1

else:return n * fact(n-1)

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

输入:

>>>10

26288800

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/304686.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

实用的网络命令汇总

通过ping检测网络故障的典型次序 正常情况下,当你使用ping命令来查找问题所在或检验网络运行情况时,你需要使用许多ping命令,如果所有都运行正确,你就可以相信基本的连通性和配置参数没有问题;如果某些ping命令出现运行…

EFCore查缺补漏(二):查询

相关文章: EFCore查缺补漏第 20 轮 TechEmpower 评测结果出炉了,ASP.NET Core 的 Plaintext 成绩名列前茅,带着 EFCore 的测试却在 Single query / Multiple queries / Fortunes 中落了下风,成绩远不如 dapper,更不如直…

如何在mysql中打开mongodb_图解:如何从MySQL移植到MongoDB

【IT168 技术】下图是使用 SQL 和 MongoDB 的对应信息图表,点击图片查看大图:MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。他支持的数据结构非常松散,是类似…

仿真模拟,需要注意这几点!

周日晚上的直播甚是精彩先是潘同学分享了获奖论文和解题技巧接着是董同学分享了论文的写作小技巧po几张截图让大家感受下此时此刻可能会有不少童鞋正在为错过直播而懊悔不用担心超模君还准备了一份豪华大礼本周超模君特意邀请到今年美赛D题特等奖获奖者谢挺同学(获奖…

mfc从mysql中读取数据类型_在MFC中使用SQlite数据库读取数据

本人在数据库里面用回调函数来处理读取函数的返回值,回调函数必须使用static类型才可以,这样处理起返回的数据变得非常的麻烦,很难处理结果集。后来从网上找了一个预编译的例子,放在网上和网友分享。例子成功的调试通过了sqlite3 *db 0;sqli…

php 结构体_php基础知识集合

微信公众号:PHP在线源码PHP 独特的语法混合了 C、Java、Perl 以及 PHP 自创新的语法编译器编译器就是将“一种语言(通常为高级语言)”翻译为“另一种语言(通常为低级语言)”的程序一个现代编译器的主要工作流程:源代码 (source code) → 预处理器 (prepr…

Kubernetes 凭什么成了云原生应用底座?

微软开源的 云原生应用开发的框架 Dapr 发布了1.0 版本《Dapr 正式发布 1.0》,云原生应用开发更加简单容易,Dapr 的容器编排环境也是用的Kubernetes。过去几年,以 Docker、Kubernetes 为代表的容器技术已发展为一项通用技术,BAT、…

【汇总推荐】深度学习、自然语言处理干货笔记汇总

今天这篇文章对十一月份推送的干货笔记,做一个总结,大家可以进行分类查找,希望对大家有所帮助。人工智能实战技巧与学习方法系列免费公开课【重磅福利】人工智能实战技能与学习方法系列公开课免费分享深度学习干货文章【直观理解】一文搞懂RN…

计算机网络四级考试

计算机网络四级考试         第一章网络系统结构与设计的基本原则7月15日  8月6日          第二章中小型网络系统总体规划与设计方法7月17日  8月8日          第三章IP地址规划和设计方法7月19日  8月10日          第四章路由…

mongodb时间范围查询少8个小时_为何要对开源mongodb数据库内核做二次开发

关于作者前滴滴出行技术专家,现任OPPO文档数据库mongodb负责人,负责oppo千万级峰值TPS/十万亿级数据量文档数据库mongodb内核研发及运维工作,一直专注于分布式缓存、高性能服务端、数据库、中间件等相关研发。后续持续分享《MongoDB内核源码设…

谷歌微软高通反对英伟达收购ARM 值得国人深思

日前,外媒报道全球一些顶尖科技公司正在向美国反垄断监管机构表达反对英伟达公司收购ARM,认为该交易将损害对其业务至关重要的行业领域的竞争。谷歌、微软和高通公司等公司都对这笔价值400亿美元的交易感到担忧,并要求反垄断官员进行干预。谷…

爬虫 404 try_和我一起学爬虫

前几天就想写一个爬虫系列的文章,因为比较忙所以没有写(还不是因为懒),趁着现在屋里比较的凉爽,心也比较的静,总结下目前遇到的一些爬虫知识,本系列将从简单的爬虫开始说起,以后会逐…

女神一秒变路人!腾讯研究AI卸妆效果算法出品“一键卸妆”功能

综合自:快科技、腾讯国际计算机视觉大会(ICCV)于 10 月 22 日到 29 日在意大利威尼斯举办,会上,腾讯优图团队带来了一个让所有女生恨得牙痒痒的功能——“一键卸妆”。所谓道高一尺魔高一丈,美图秀秀造福了…

perl对文件和目录进行操作

对文件和目录进行操作opendir 目录句柄,“目录”;for $a(readdir 目录句柄){printer $a}areaddir HOME;打印目录,没有排序。查找递归目录用File::Find删除文件:(只是删掉连接,数据应该还没有删掉。我是这样…

二进制序列化

在计算机世界,万物皆01二进制,包括各种各样的文件格式和网络协议,二进制格式最为常见!NewLife.Core 内置了完整的二进制序列化框架 Binary,经过十多年洗礼,发展到了第三代支持Handler处理器扩展。Binary的同…

python搭建项目结构_Django搭建项目实战与避坑细节详解

Django 开发项目是很快的,有多快?看完本篇文章,你就知道了。安装 Django前提条件:已安装 Python。Django 使用 pip 命令直接就可以安装:pip install django如果安装失败,很可能是因为网络连接超时了&#x…

matlab基于ssd的角点匹配_基于关键点的目标检测

0 1前言:基于锚点的目标检测方法在基于关键点(key points)的目标检测方法出现之前,主流目标检测方法一般先设置一些预先定义好的 锚点 (anchor boxes)。 作为预测物体框的参考,神经网络只需要预测实际的物体框相对于这些锚点的偏移。 这样模型…

python中summary_python summary_study.py

#!/usr/bin/env python#-*- coding:utf-8 -*-import os,sys,time,shutil,refrom _ast import Numfrom django.db.models.sql.datastructures import Join---------------------------此脚本用于之前学习内容的回顾装饰器还需要多看,目前还是不是很清楚类的继承prope…

NLog整合Exceptionless

前言在实际的.Net Core相关项目开发中,很多人都会把NLog作为日志框架的首选,主要是源于它的强大和它的扩展性。同时很多时候我们需要集中式的采集日志,这时候仅仅使用NLog是不够的,NLog主要是负责代码中日志的落地,也就…

40个只有程序员才看得懂的段子

1. 一程序员去面试,面试官问:“你毕业才两年,这三年工作经验是怎么来的?!”程序员答:“加班。”2. 某程序员对书法十分感兴趣,退休后决定在这方面有所建树。于是花重金购买了上等的文房四宝。一…