1. 引言及抽象和结构

生成斐波那契数列的代码如下:

 fibs = [0, 1]
num = int(input('How many num you want:'))
for x in range(num-2):
fibs.append(fibs[-2] + fibs[-1])
print(fibs) 结果:
How many num you want:8
[0, 1, 1, 2, 3, 5, 8, 13]

(1)让程序更抽象,可以让人更容易理解。

(2)函数,是结构化编程的核心。

2. 自定义函数

(1)使用def 语句定义函数,以实现结构化编程

 def fibs(num):
fib_result = [0, 1]
for x in range(num-2):
fib_result.append(fib_result[-2] + fib_result[-1])
return fib_result number = int(input('how many num do you want:'))
print(fibs(number)) 结果:
how many num do you want:12
[0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89]

(2)可使用内置函数callable 判断某个对象是否可调用,返回布尔值True,False

(3)return 语句非常重要,用于从函数返回值。

  2.1 给函数编写文档

  给函数编写文档,便于其他人能够理解函数。放在函数开头的字符串称为文档字符串(独立的字符串),将作为函数的一部分被存储起来。

  可以使用 __doc__ 函数属性查询函数的解释,双下划线表示特殊属性。

 def square(x):
'Caluates the square of the number x.'
return x * x print(square.__doc__) 结果:
Caluates the square of the number x.

  2.2  所有函数都返回值,如果你没有告诉函数该返回什么,将返回None.

  ***2.3 不要让这种默认返回行带来麻烦。如果你在if 之类的语句中返回值,务必确保其他纷至也返回值,以免在调用者期望函数返回一个序列时,不小心返回了None。

3. 参数魔法

(1)能修改参数吗?

 #能修改参数吗?下面的例子不能
def try_to_change(n):
n = 'Mr.Gumby'
return n name = 'Mrs.Entity'
try_to_change(name)
print(name) 结果:
Mrs.Entity 上述修改并未成功,原因是,执行过程等同如下:
name = 'Mrs.Entity' n = name
n = 'Mr.Gumby'
try_to_change(name) 实际结果 改变的是n的值:'Mr.Gumby' name = 'Mrs.Entity' # name的指向并未发生改变
print(name): 'Mrs.Entity'

如果换成列表,则结果会不一样

#能修改参数吗?下面的例子能
def change(n):
n[0] = 'Mr.Gumby'
# return n names = ['Mrs.Entity', 'Mrs.Thing']
change(names)
# change(names[:])
print(names) 结果:
['Mr.Gumby', 'Mrs.Thing'] #可以看出结果变了 原因,实际执行过程:
name 指向 列表['Mrs.Entity', 'Mrs.Thing'];
执行change(name)函数,n 指向 name,
n = name,n= ['Mrs.Entity', 'Mrs.Thing'],name = ['Mrs.Entity', 'Mrs.Thing']
n[0] = 'Mr.Gumby' 修改n列表的只,因为n和name实际指向同一个list,故即使是通过n修改的list,name输出的也是修改后的结果。
具体参看list修改。

  1)为何要修改参数

  因为在提高程序的抽象程度方面,使用函数来修改数据结构(如列表或字典)是一种不错的方式。

具体示例如下,需要认真理解:

 # 1. 定义一个初始化数据结构的函数
def init(data):
data['first'] = {}
data['middle'] = {}
data['last'] = {} # 2. 获取人员姓名的函数
def lookup(data, lable, name):
return data[lable].get(name) # 3. 存储人员姓名的函数
def store(data, full_name): # 将参数data和full_name提供给这个函数,这些参数被设置为从外部获得的值
names = full_name.split() # 通过拆分full_name创建一个名为names的列表
if len(names) == 2: # 如果names的长度为2(只有名和姓),就将中间名设置为空字符串
names.insert(1, '')
labels = 'first', 'middle', 'last' # 将这几个元素存储在元组lables中 for lable, name in zip(labels, names): # 使用zip函数将标签和对应的名字合并,以便对每个标签-名字对 执行如下操作
people = lookup(data, lable, name) # 1)获取属于该标签和名字的列表
if people:
people.append(full_name) # 2)将full_name附加到该列表末尾或插入一个新列表
else:
data[lable][name] = [full_name] mynames = {}
init(mynames)
store(mynames, 'Magnus Lie Hetland')
look_result = lookup(mynames, 'middle', 'Lie')
print(look_result)

  2)如果参数不可变

(2)关键字参数和默认值

前述(1)中所使用的均是位置参数,因为这些参数的位置非常重要。

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

通常,不应结合使用位置参数和关键字参数

(3)收集参数

参数前面加星号,可将提供的所有值都放在一个元组中,也即将这些值收集起来。

 def print_params(*params):
print(params) print_params('Testing')
结果:
('Testing',)
 def print_params2(title, *params):
print(title, end=' ')
print(params) print_params2('numbers:', 1, 2, 3)
结果:
numbers: (1, 2, 3)

带星号(*)的参数也可以放在其它位置,而不一定是最后,但是该情况下必须使用名称指定后续参数

 def in_the_middle(x, *y, z):
print(x, y, z)
in_the_middle(1, 2, 3, 4, 5, 6)
结果:
TypeError: in_the_middle() missing 1 required keyword-only argument: 'z' # 根据报错提示,修改为如下:
def in_the_middle(x, *y, z):
print(x, y, z)
in_the_middle(1, 2, 3, 4, 5, z=6)
结果:
1 (2, 3, 4, 5) 6

星号(*)不会收集关键字参数,若要实现收集关键字参数,需使用两个星号(**)

 def print_params3(title, *pos, **params):
print(title)
print(pos)
print(params) print_params3('dict:','a','b','c', x=1, y=2, z=3) 结果:
dict:
('a', 'b', 'c')
{'x': 1, 'y': 2, 'z': 3}

(4)分配参数 - 不是很懂???

4.作用域

5. 递归

6. 本章小结

6.1 本章关键词

抽象:通过定义处理细节的函数,可让程序更抽象

函数定义:使用def语句定义函数。函数由语句块组成,它们从外部接受值(参数),并可能返回一个或多个值(计算结果)

参数:函数通过参数(调用函数时被设置的变量)接受所需的信息。在Python中,参数有两类:位置参数和关键字参数。通过给参数指定默认值,可使其变成可选的。

作用域:变量存储在作用域(命名空间)中。在Python中,作用域分两大类:全局作用域和局部作用域。作用域可以嵌套。

递归:函数可调用自身,称为递归。可使用递归完成的任何任务都可使用循环来完成,但有时使用递归函数的可读性更高。

函数式编程:Python提供了一些编程工具,其中包括lambda表达式以及函数map、filter和reduec。

6.2 新介绍函数

 map(func, seq[, seq, ...])     #对序列中的所有元素执行函数
filter(func, seq) #返回一个列表,其中包含对其执行函数时结果为真的所有元素
reduce(func, seq[, initial]) #等价于func(func(seq[0], seq[1], seq[2]), ...)
sum(seq) #返回seq中所有元素的和
apply(func[, args[, kwargs]]) #调用函数(还提供需要传递给函数的参数)

Python基础 第6章 抽象的更多相关文章

  1. Python基础 第三章 使用字符串(3)字符串方法&本章小结

    字符串的方法非常之多,重点学习一些最有用的,完整的字符串方法参见<Python基础教程(第三版)>附录B. 模块string,虽然风头已小,但其包含了一些字符串方法中没有的常量和函数,故将 ...

  2. 第十三章 Python基础篇结束章

    从2019年3月底开始学习Python,4月份开始在CSDN发博客,至今不到半年,老猿认为博客内容中关于Python基础知识的内容已经基本告一段落,本章进入Python基础知识结束章节,对Python ...

  3. Python基础 第7章 再谈抽象

    1. 1 多态 多态,即便不知道变量指向的是哪种对象,也能对其执行操作,且操作的行为将随对象所属的类型(类)而异. 1.2 多态与方法 当无需知道对象是什么样的就能对其执行操作时,都是多态在起作用. ...

  4. python基础教程-第二章-列表和元组

    本章将引入一个新的概念,:数据结构.数据结构是通过某种方式(例如对元素进行编号)组织在 一起的数据元素的集合,这些数据元素可以是数字或者字符,甚至可以是其他数据结构.在python中,最基本的数据结构 ...

  5. Python基础教程-第一章-变量、函数、字符串

    1.1变量 变量基本上就是代表(或者引用)某个值的名字,举例来说,如果希望用x代表3,只需要执行下面的语句即可: >>>x = 3 这样的操作称为赋值(assignment),值3赋 ...

  6. Python基础 第四章 字典(2)字典方法&章小结

    1. clear 方法clear删除所有的字典项,就地执行,什么都不返回(或者说返回None) d = {} d['name'] = 'Gumby' d['age'] = 42 print(d) re ...

  7. python基础(二)抽象

    1 函数与模块 编程大师Martin Fowler先生曾经说过:"代码有很多种坏味道,重复是最坏的一种!" 函数 为了减少代码中重复出现的冗余代码,通常我们选择创建函数来供代码重复 ...

  8. Python基础 第5章 条件、循环及其他语句(2)

    6. 简单推导 列表推导,是一种从其他列表创建列表的方式,其原理类似于for循环. list1 = [x * x for x in range(10)] print(list1) 结果: [0, 1, ...

  9. Python基础 第四章 字典(1)

    通过名称来访问其各个值的数据结构,映射(mapping). 字典,是Python中唯一的内置映射类型,其中的值不按顺序排列,而是存储在键下.(键,可能是数.字符串.元组). 1.1 字典由 键 及其相 ...

随机推荐

  1. commit 没有提交图片,但是出现了commit的修改

    .gitignore里面写上 image/cache/  就好了

  2. 安装virtual box

    将安装包放在app目录下: 进入安装目录,输入sudo gdebi 安装包名 安装完后,可以在搜索框中搜索:virtual 会出现安装好的虚拟机盒子.

  3. Redis学习(一) —— 基本使用与原理

    一.数据结构 string Redis字符串是可修改字符串,在内存中以字节数组形式存在. 下面是string在源码中的定义,SDS(Simple Dynamic String) struct SDS& ...

  4. 2.linux的增删改查

    一.增删改查       1.建立文件和目录         mkdir /tmp/xueying       2.cd 进入的路径         绝对路径:以根目录为其实目录的路径         ...

  5. thymeleaf 直接调用后台Service

    前端thymeleaf <select name="sex" class="form-control m-b" th:with="type=${ ...

  6. javascript的正则表达式总结

    网上正则表达式的教程够多了,但由于javascript的历史比较悠久,也比较古老,因此有许多特性是不支持的.我们先从最简单地说起,文章所演示的正则基本都是perl方式. 元字符 ( [ { \ ^ $ ...

  7. qt 加载翻译文件 qm

    QTranslator* myTranslator=new QTranslator; myTranslator->load("xxx.qm"); app.installTra ...

  8. arcgis python 新生成的数据设置

    try: # Update the spatial index(es) # r = arcpy.CalculateDefaultGridIndex_management(outFeatures) ar ...

  9. 【Maven】为什么Maven dependencies有的jar包显示为灰色?

    因为它们的scope被限制住了,放开就恢复为亮白色. 来两张图片比对一下就清楚了: 没有限制scope,是正常的亮白色. 限制scope为test,显示为灰黑色. 其实颜色不重要,重要的是scope会 ...

  10. 用户登录之asp.net cookie的写入、读取与操作

    页面前面: <div id="login" runat="server"> <span class="log_title" ...