Python基础教程(第三版)(六) 抽象

一个菜鸡的挣扎
就总结下
and 如果有大佬不小心看到了发现了错误,就欢迎指正

6.1懒惰是一种美德

通过创建函数以调用之可以减少代码量

6.2 抽象和结构

抽象是程序能够被人理解的关键所在(无论对编写程序还是阅读来说,这都至关重要)

函数封装了人不需要关心的实现细节,从而更容易被使用和理解

6.3 自定义函数

6.3.1 给函数编写文档

在def后面添加字符串,相当于给整个函数添加注释,以确保被人理解
__doc_ _是函数的一个属性,可用它来访问函数的文档字符串
我自己的练习:

def lalala(x):
    """就瞎写的"""
    print(x)

print(lalala.__doc__)

结果:

这里书上说用单引号,但是pycharm中会有提示,要让用连续的三个双引号
help()函数可访问有关函数的信息,其中会包含函数的文档字符串

In [1]: help(round)
Help on built-in function round in module builtins:

round(...)
    round(number[, ndigits]) -> number

    Round a number to a given precision in decimal digits (default 0 digits).
    This returns an int when called with one argument, otherwise the
    same type as the number. ndigits may be negative.

6.3.2 其实并不是函数的函数

就是有的函数没有return 或者return后面没有指定值,这么做将会返回None

6.4 参数魔法

6.4.1 值从哪里来 略

6.4.2 我能修改参数吗

可变参数可以,不可变参数不可以
如果不想让可变参数的值在调用函数后发生变化,可以向函数中传递切片或者用copy()传递副本(如果有copy()的话)
自己的练习:

def change(n):
    n[0] = 'a'

x = [1, 2, 3]
change(x)
print(x)

结果;

change(x[:])
print(x)

结果:

change(x.copy())
print(x)

结果:

如果想让不可变参数发生变化,可以使之重新指向返回的值,或者干脆把它放在列表中

6.4.3 关键字参数和默认值

这个部分之前看过了,少总结下

像这种用名称指定的参数称为关键字参数,主要优点是有助于澄清各个参数的作用。

关键字参数在传入时的顺序与定义时的不一样也没关系,反正有关键字程序不会认错
可以为关键字参数设置默认值,如果在调用该参数没有传入,就使用默认值
位置参数不可定义在关键字参数后面!
关键字好像只能是字符串,我的试验:

def test(*a, **b):
    print(a, b)

b = {1: 'a', 2:'b'}
test(1, **b)

然后会报错:

6.4.4 收集参数

带星号的参数会收集多余的值,放在元组中
一个星号不会收集关键字参数!若想收集,可带两个星号,这样会得到字典而非数组
位置参数最好不要放在星号参数后面,虽然指定名称也可以调用

6.4.5 分配参数

类似于序列解包,可大致理解为与收集参数相反的操作

6.5 作用域

  • vars()函数 ,返回作用域中看不见的字典,最好不要使用它修改字典中的值,因为其结果是不确定的
  • 在函数中读取全局变量而非访问它,一般不会造成任何问题,但这样通常会不小心写出Bug
  • 如果局部变量与全局变量重名,必要时可使用globals()[‘变量名‘]来访问它,globals()类似于vars(),也返回一个字典
  • 在函数中定义变量时,可在前面加入global 来声明它是全局变量
  • 作用域嵌套,可在函数中再定义函数,并用return返回这个函数

在函数中访问全局变量:

# 在函数中访问全局变量
y = '全局'
def test(x):
    print(x+y)
test('局部')

结果:
PS:做作业时发现np.array不用gobal关联也会变化,于是猜测,可变变量似乎不用关联也会变化

如果局部变量与全局变量重名:

# 如果局部变量与全局变量重名
y = '全局'
def test(y):
    print(y+globals()['y'])
test('局部')

结果同上
重新关联全局变量:

# 重新关联全局变量
y = '全局'
def test():
    global y
    y = '我变了'
test()
print(y)

结果:
关于作用域嵌套:

In [2]: def first(x):
   ...:     def second(y):
   ...:         return y**x
   ...:     return second
   ...: fun = first(2)
   ...: fun(2)
Out[2]: 4

6.6 递归

这个就不说了

函数式编程

  • 主要说了map,filter,reduce,lambda
  • 在较新的python版本中,可以用列表推导代替map和filter
  • map:对列表中所有元素执行函数
In [3]: list(map(str,range(10)))
Out[3]: ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9']

In [4]: # 与下面等价

In [5]: [str(i) for i in range(10)]
Out[5]: ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9']
  • filter: 对序列中元素执行函数,若为结果真,把它添加到最终要返回的列表中
In [6]: def  fun(x):
   ...:     return x.isalnum()
   ...: list(filter(fun,['fdas','fdsa3','1*&']))
Out[6]: ['fdas', 'fdsa3']
# 与[x for x in [....] if x.isalnum] 等价
  • reduce: 这个还是看例子
In [1]: from functools import reduce
In [2]: reduce(lambda x,y: x+y, [1,2,3,4,5,6,7,8,9])
Out[2]: 45 

lambda的作用很明显了

补充:

通常,不能给外部作用域内的变量赋值,但如果一定要这样做,可使用关键字nonlocal。这个关键字的用法与global很像,让你能够给外部作用域(非全局作用域)内的变量赋值。

总结

抽象、函数定义、函数传参、作用域、函数式编程(主要是函数式编程工具,用以代替定义函数)
完了,希望不是在做无用功

Python基础教程(第三版)(七)再谈抽象

原文地址:https://www.cnblogs.com/xmusxy/p/10914363.html

时间: 2024-09-29 17:37:31

Python基础教程(第三版)(六) 抽象的相关文章

《python基础教程第三版》高清版PDF免费下载

Python基础教程 第3版Python简明教程书籍 Python编程从入门到实践 灵程序设计丛书 下载地址:网盘下载 编辑推荐 久负盛名的Python入门经典 中文版累计销量200 000+册 针对Python 3全新升级 本书是经典的Python入门教程,层次鲜明.结构严谨.内容翔实,特别是后面几章,作者将前面讲述的内容应用到10个引人入胜的项目中,并以模板的形式介绍了项目的开发过程,手把手教授Python编程实践,让读者从项目中领略Python的真正魅力. 本书既适合初学者夯实基础,又能帮

《Python基础教程第3版》PDF中英文+代码资料分享学习

<Python基础教程第3版>包括Python程序设计的方方面面:首先从Python的安装开始,随后介绍了Python的基础知识和基本概念,包括列表.元组.字符串.字典以及各种语句:然后循序渐进地介绍了一些相对高级的主题,包括抽象.异常.魔法方法.属性.迭代器:此后探讨了如何将Python与数据库.网络.C语言等工具结合使用,从而发挥出Python的强大功能,同时介绍了Python程序测试.打包.发布等知识:最后,作者结合前面讲述的内容,按照实际项目开发的步骤向读者介绍了10个具有实际意义的P

【Python基础教程第2版】——第一讲:基础知识

1.长字符串:(用三引号如'''或者"""来引起来) >>> print """This is a very log string.It continues here.And it's not over yet."Hello world!"""" This is a very log string.It continues here.And it's not over yet.&

《Python基础教程 第2版&#183;修订版》 第2章 列表和元组(学习笔记&#183;总)

这章东西有点多,因此,分成了三份来写,总体来说,这章内容较基础,以下是一二三的链接 <Python基础教程 第2版·修订版>第2章 列表和元组(学习笔记·一) <Python基础教程 第2版·修订版>第2章 列表和元组(学习笔记·二) <Python基础教程 第2版·修订版>第2章 列表和原组 (学习笔记·三) 版权声明:本文为博主原创文章,未经博主允许不得转载.

《Python基础教程 第2版 修订版》学习笔记(一)

<Python基础教程 第2版 修订版>学习笔记(一) 第一章:快速改造:基础知识 1.1 安装Python (略) How to Become a Hacker: http://www.catb.org/~esr/faqs/hacker-howto.html 中文版:如何成为一名黑客 http://blog.jobbole.com/64196/ (伯乐在线版,个人认为目前比较完善的版本) 1.2 交互解释器 >>> 1.3 算法是什么 目标:煮一盘午餐肉加鸡蛋的食物 过程:

《python基础教程(第二版)》学习笔记 字符串(第3章)

<python基础教程(第二版)>学习笔记 字符串(第3章)所有的基本的序列操作(索引,分片,乘法,判断成员资格,求长度,求最大最小值)对字符串也适用.字符串是不可以改变的:%左侧是格式字符串,右侧是需要格式化的值print '%s=%d' % ('x',100) ==> x=100%% 格式字符串中出现 %模板字符串:from string import Templates=Template('$x is 100');  s.substitute(x='ABC');  ==> '

《Python基础教程(第二版)》学习笔记 -&gt; 第九章 魔法方法、属性和迭代器

准备工作 >>> class NewStyle(object): more_code_here >>> class OldStyle: more_code_here 在这两个类中,NewStyle是新式的类,OldStyle是旧式的类,如果文件以__metaclass__ = type 开始,那么两个类都是新式类. 构造方法 构造方法,当一个对象被创建后,会立即调用构造方法.Python中创建一个构造方法,只要把init方法的名字从简单的init修改成__init__

《Python基础教程(第二版)》学习笔记 -&gt; 第十章 充电时刻 之 标准库

SYS sys这个模块让你能够访问与Python解释器联系紧密的变量和函数,下面是一些sys模块中重要的函数和变量: 函数和变量 描述 argv 命令行参数,包括脚本和名称 exit([arg])                退出当前的程序,可选参数为给定的返回值或者错误信息 modules 映射模块名字到载入模块的字典 path 查找模块所在目录的目录名列表 platform 平台标识符 stdin 标准输入流-- 一个类文件对象 stdout 标准输出流-- 一个类文件对象 stderr

《python基础教程(第二版)》学习笔记 字典(第4章)

<python基础教程(第二版)>学习笔记 字典(第4章)创建字典:d={'key1':'value1','key2':'value2'}lst=[('key1','value1'),('key2','value2')]; d=dict(lst)d=dict(key1='value1', key2='value2')字典基本操作:d={'key1':'value1','key2':'value2'}; len(d) ==> 2 #字典中的键值对数量d={'key1':'value1','

《python基础教程(第二版)》学习笔记 基础部分(第1章)

<python基础教程(第二版)>学习笔记基础部分(第1章)IDEWindows: IDLE(gui), Eclipse+PyDev; Python(command line);Linux/Unix: python >>> 1/2=0 注意整除得0>>> from __future__ import division 执行普通的除法python -Qnew 执行普通的除法 //整除,  1//2=0:%取余数:**乘幂长整型数: 末尾带L十六进制,以0x开头