python学习笔记(五)、抽象
不知不觉已经快毕业一年了,想想2018年过的可真舒适!!!社会就像一锅水,不同地方温度不同,2018年的我就身处温水中,没有一丝想要进取之心。
1 抽象
抽象在程序中可谓是神来之笔,辣么什么是抽象呢?抽象就是对一种事物或现象等,移除一些不相关的信息,只保留最终需要的信息。例如,一个篮球,说复杂点儿,它是由各种材料等组成,抽象就是不去管这些具体且不相关的信息,说简单点儿就是一个球,这样类似的球还有很多,比如乒乓球等(这样可以谈到继承,后面一张会详谈)。
2 自定义函数
函数就是对某个具体操作进行抽象化,并能够一次编写,多次使用,我们在使用中不再关心具体实现,只关心参数传递。
在python中,要判断某个对象是否可调用,可以使用内置函数callable。函数也是一个对象。如:callable(function1) ——> True x = 1 callable(x) ——> False
辣么在python中怎么创建自定义函数呢?使用python提供的关键字 def 表示定义函数。如:
def fun1(name):
.......
3 给函数编写文档
一个良好的程序,不仅运行效率高,代码风格简洁等,最重要的是要有一个良好的文档解释,也就是一般我们所说的注释。注释就好比面试时候的一份简历,告诉面试官你是干什么的,能干什么等。
要给函数编写文档,以确保其他人能够理解,可添加注释(以 # 打头的内容)。在python中,还有一种编写注释的方式,就是添加独立的字符串。比如在函数def 语句后面,添加独立字符串,如:
def fun1(name):
'打印出name'
print("name : " + name)
形如这样放在函数开头的字符串我们称为文档字符串(docstring),它将作为函数的一部分信息被存储起来。
在python中,通过functionname.__doc__ 获取函数的文档字符串信息。__doc__ 是函数对象的一个属性。属性名中的双下划线表示这是一个特殊的属性。fun1.__doc__ ——> '打印出name'
注意:在python中,所有的函数都有返回值return的。如果在代码中,函数并没有return什么,辣么它将返回None。
4 参数
很多我们自定义的函数都会给它附带一些参数,好根据这些参数进行相关处理。一般在def语句中,位于函数名称后面的变量统称为形参,而在调用函数时提供的参数值称为实参。
4.1 传值和传地址引用
通常我们在参数传递是,分为值传递和地址引用传递。值传递:方法在调用执行过程中,将值传递给方法中对应的参数,在方法中对该值进行修改,并影响实际实参的值。引用传递:在方法调用执行过程中给对象参数传值后,方法中对该值的修改,实参的值也相应的修改了。辣么如果在实际开发过程中,遇到了那种实际传参是引用传递,而我们需要的又是值传递,怎么办呢?针对这样的需求,我们通常是给实参创建一个副本。如:names = ['name1','name2'] ns = names[:]
4.2 关键字参数和默认值
在前面使用的参数都属于位置参数。形参的值根据位置一一对应着实参传递进来的顺序。如:def fun1(name,age): ........ 调用时:fun1(name,age) 。在实际开发中,python还提供了关键字参数。关键字参数是根据参数名称进行传值调用执行的,这样有助于表名出各个参数的作用,并且,可以指定默认值。如:def fun1(name='xxx',age=0) 。在实际开发中,像这样指定了值得参数,调研函数时可以不提供这个参数,函数在执行过程中,会使用默认提供的那个值。如:
def fun1(name='xxx',age=0,addr='地球'):
print(f'name: {name} age: {age} addr: {addr}')
fun1(age=23,name='张三') ——> name:张三 age: 23 addr: 地球
程序使用过程中,还可以结合位置参数与关键字参数,但必须先指定所有位置参数,否则解释器将不知道它们是那个参数,即不知道参数对应的位置,在开发中,这种方式使用的很少,大家了解一哈就行。
4.3 收集参数
有时候,允许用户提供任意数量的参数很有用。python提供了带星号( * )的参数,该参数将调用函数时多余的参数收集起来,组合成一个元祖(有点儿像前面提高的赋值:序列解包)。调用函数时,如果没有给带星号的参数提供值,该参将表示为一个空元祖 () ;带星号的参数通常放在其他形参的最后面,但是也可以放在其他位置,值得注意的是放在其他位置时,后面的参数需要使用名称来指定,也就是使用关键字参数。
星号运算符( * )不会收集关键字参数。如果要手机关键字参数,可以使用两个星号( ** )。如def fun1(**params):print(params) ——> {'param1':'value1','param2':'value2',.........} 。这样得到的是一个字典类型的变量。
4.5 分配参数
前面介绍了如何将参数收集到元祖或字典中,但用同样的两个运算符( * 和 ** )也可以执行相反的操作。如:
def addXY(x,y):print(f'{x} + {y}', (x+y), sep=' = ')
params = (2, 3)
addXY(*params) ——> 2 + 3 = 5
如果在定义和调用函数时都使用 * 或 **,将只能传递 元祖 获取 字典 来调用。因此还不如不使用它们,直接传值调用。所有,一般而言,在实际开发中,只有在定义函数(允许可变数量的参数) 或 调用函数时(拆分字典或序列)使用 * 和 **。
5 递归
递归表示在函数内部又再次调用本身。如:
def fun1():
fun1()
在实际中,有很多栗子可以用递归来实现,比如常见的阶乘、二分查找。小伙伴们不妨可以使用递归来编写一哈。
python学习笔记(五)、抽象的更多相关文章
- python学习笔记3_抽象
这一步的学习四个知识点,如何将语句组织成函数,参数,作用域(scope),和递归 一.函数 1.抽象和结构 抽象可以节省很多的工作量,实际上它的作用更大,它是使得计算机程序让人读懂的关键(这也是最基本 ...
- Python学习笔记(五)函数和代码复用
函数能提高应用的模块性,和代码的重复利用率.在很多高级语言中,都可以使用函数实现多种功能.在之前的学习中,相信你已经知道Python提供了许多内建函数,比如print().同样,你也可以自己创建函数, ...
- python学习笔记五 模块上(基础篇)
模块学习 模块,用一砣代码实现了某个功能的代码集合. 类似于函数式编程和面向过程编程,函数式编程则完成一个功能,其他代码用来调用即可,提供了代码的重用性和代码间的耦合.而对于一个复杂的功能来,可能需要 ...
- Python学习笔记五
一. 递归 递归函数: def a (): print ("from b") b() def b(): print("from a ") a() a() 递推和 ...
- Python学习笔记五:错误与异常
一:常见异常与错误 BaseException 所有异常的基类SystemExit 解释器请求退出KeyboardInterrupt 用户中断执行(通常是输入^C)Exception 常规错误的基类S ...
- python学习笔记(五):装饰器、生成器、内置函数、json
一.装饰器 装饰器,这个器就是函数的意思,连起来,就是装饰函数,装饰器本身也是一个函数,它的作用是用来给其他函数添加新功能,比如说,我以前写了很多代码,系统已经上线了,但是性能比较不好,现在想把程序里 ...
- Python学习笔记五(读取提取写入文件)
#Python打开读取一个文件内容,然后写入一个新的文件中,并对某些字段进行提取,写入新的字段的脚本,与大家共同学习. import os import re def get_filelist(dir ...
- python学习笔记五 模块下(基础篇)
shevle 模块 扩展pickle模块... 1.潜在的陷进 >>> import shelve>>> s = shelve.open("nb" ...
- python学习笔记五--文件
任何情况下文本文件在Python里均是字符串模式. 一.创建一个文件,并写入: 函数open(文件名,w) 二.打开一个文件,并读取: 函数open(文件名,r),“r”是默认值,可以不用写 三.使用 ...
随机推荐
- excel写入操作
字典列表类型数据写入excel. #导入xlwt库 import xlwt import os # 步骤1:获取excel文件的绝对路径 dirPath = os.path.join(os.getcw ...
- libguestfs手册(1): 架构
要编辑一个image,则运行下面的命令 guestfish -a ubuntutest.img ><fs> 会弹出一个命令行工具 运行run ><fs> run 我 ...
- MemCache详细解读
MemCache是什么 MemCache是一个自由.源码开放.高性能.分布式的分布式内存对象缓存系统,用于动态Web应用以减轻数据库的负载.它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提高 ...
- Spring Cloud 微服务架构的五脏六腑,统统晒一晒!
Spring Cloud 是一个基于 Spring Boot 实现的微服务框架,它包含了实现微服务架构所需的各种组件. 注:Spring Boot 简单理解就是简化 Spring 项目的搭建.配置.组 ...
- [Swift]LeetCode143. 重排链表 | Reorder List
Given a singly linked list L: L0→L1→…→Ln-1→Ln,reorder it to: L0→Ln→L1→Ln-1→L2→Ln-2→… You may not mod ...
- [Swift]LeetCode654. 最大二叉树 | Maximum Binary Tree
Given an integer array with no duplicates. A maximum tree building on this array is defined as follo ...
- 7.Git分支-分支简介、分支创建、分支切换
1.分支简介 几乎所有的版本控制系统都支持某种形式的分支.使用分支意味着可以把你的工作从开发主线上分离开来,以免影响开发主线.Git的分支是其必杀技,它相对于其它版本控制系统来说,具有难以置信的轻量性 ...
- 前端基本知识(三):JS的闭包理解(第一个思考题有错误,已修改)
JS闭包的理解 一.变量的作用域 二.如何从外部读取局部变量 三.什么是闭包 四.深入理解闭包 五.闭包的用途 六.使用闭包注意情况 七.JavaScript的垃圾回收机制 八.一些思考题 一.变量作 ...
- asp.net core 系列 19 EFCore介绍
一.概述 目前最新的EF Core版本是3.0,最稳定的EF Core版本是2.2.EF Core 的计划与 .NET Core以及 ASP.NET Core 版本同步.EF Core 是一个 .NE ...
- PHP中Smarty引擎的常用语法
PHP中Smarty引擎的常用语法 输出今天的日期: {$smarty.now|date_format:"%H:%M %A, %B %e, %Y"} 实际上用到了PHP的time( ...