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”是默认值,可以不用写 三.使用 ...
随机推荐
- 在IIS上新发布的网站,样式与js资源文件加载不到(资源文件和网页同一个域名下)
在IIS上新发布的网站,网站能打开,但样式与js资源文件加载不到(资源文件和网页是同一个域名下,例如:网页www.xxx.com/index.aspx,图片www.xxx.com/pic.png). ...
- SELECT 语句
常见表的操作 查看数据库的表 show table 查看表结构 desc 表名 删除表 drop table表 修改表的结构 添加列 alter table 表名 add 列名 ...
- oracle登录管理员创建数据库和表空间
登录管理员最高权限账号 cmd输入sqlplus 回车,或者直接打开sqlplus 用户名:sys 密码:sys as sysdba 1.首先,创建(新)用户: create user usernam ...
- 高效求a的n次幂的算法
代码: public class A的N次幂 { public static void main(String[] args) { int a = 2; int n = 60; long t = Sy ...
- ansible基础-playbooks
1. playbooks介绍 如果说ansible的modules是工具,inventory配置文件是原材料,那么playbook就是一封说明书,这里会记录任务是如何如何执行的,当然如果你愿意,这里也 ...
- [Swift]LeetCode220. 存在重复元素 III | Contains Duplicate III
Given an array of integers, find out whether there are two distinct indices i and j in the array suc ...
- [Swift]LeetCode620. 有趣的电影 | Not Boring Movies
SQL架构 Create table If Not Exists cinema (id ), description varchar(), rating , )) Truncate table cin ...
- Android开发:在Eclipse中配置Android环境
一.文件需要: https://pan.baidu.com/s/1-XCSSPW5JGyPRlvwRVSfmA 提取码:m5t8 NDK过大没有上传在这个文件里. 二.在Eclipse中配置Tools ...
- SpringBoot前后端分离Instant时间戳自定义解析
在SpringBoot项目中,前后端规定传递时间使用时间戳(精度ms). @Data public class Incident { @ApiModelProperty(value = "故 ...
- [SDOI2018] 旧试题
推狮子的部分 \[ \sum_{i=1}^A\sum_{j=1}^B\sum_{k=1}^C\sigma(ijk) =\sum_{i=1}^A\sum_{j=1}^B\sum_{k=1}^C\sum_ ...