这一步的学习四个知识点,如何将语句组织成函数,参数,作用域(scope),和递归

一、函数

1、抽象和结构

抽象可以节省很多的工作量,实际上它的作用更大,它是使得计算机程序让人读懂的关键(这也是最基本的要求,不管是读程序还是写程序。)

2、创建函数

  1、使用def函数就可以定义函数,2、2.0python使用callable(<func>),检查函数是否可以被调用,3.0python使用hasattr(func,_call_),。3、函数返回一个以上的的值,在元组中返回即可。

2.1、记录函数

给函数写文档,让使用该函数的人理解两种方式,一种加入注释(#开头)。另一种方式是:直接写上字符串,这类字符串在其他地方可能非常有用。

其中的__doc__可以访问文档字符串。

2.2、并非真正函数的函数

有些python函数不返回任何东西,在其他语言中可能有别的名称,但是python中函数就是函数。即便没有返回值python也会默认返回None。

二、参数魔法

注意 def语句后面的变量通常叫做函数的形式参数,而调用函数的时提供的有值是实际参数,也成参数。

1、我能改变参数吗?

分两种情况:1、字符串元组以及数字,这些不可变参数。在函数内修改参数不会影响到从函数外部传入的参数变量。(因为传递的是副本,也就是值类型)

2、字典,list等这些,传入参数,在函数内部修改会影响到外面传入的这个参数变量。(因为两个变量引用同一个列表。想要不影响函数外面的变量指向的list.。可以对这个list做切片,因为切片总是返回的副本。)

  

2、为什么想要修改参数

使用函数修改数据结构(比如字典和list)是将程序抽象化的好方法。

例子:做一个存储名字,并能通过,姓字,中间字,和最后字,查询联系人。

实现:

1、先建立storage={} 字典。

2、 建立,first ,middle,last三子字字典

3、存储名字 

4、这样存储名字,一两个还好说,如果多个就非常麻烦而且容易出错。这里就需要使用函数封装具体操作。

4.1、封装初始化storage的操作

 调用

4.2、在编写存储名字函数之前,先要写获取获取名称的函数

  先手动存储一个名字查询名字

4.3、存储名字的函数,注意因为函数修改的是list和字典。所以当函数内修改以后,list或字典也跟着变化。函数返回的是None。

注意:zip是压缩两个list为键值对。     尝试使用

4.4、额外知识

改变不可变参数。例如数字,出入的参数是数字,在函数内部改变,不会影响到函数的外部,这个传入参数变量。

   

3、关键字参数和默认参数

截至目前,前面学习的都是位置参数。位置参数,位置比他们的名字更重要。

  可以看出位置参数,名称不重要。

传入位置参数,结果无区别    接下来传入 关键字参数。那就有区别了

定义带关键字参数函数       因为关键函数可以提供默认值,说以调用可以传空 

也可以把位置参数和关键字参数混合使用,但是一般不推荐这样做。除非是强制要求的参数个数比可修改的带具有默认值的参数个数少的时候才使用混合。

4、收集参数

在有些时候让用户输入任意数量的参数是很有必要的。有两中方式实现

1.、def print_params(*params)

pring(params)        #这里(*)星号参数的意思是,将所有参数收集到元祖里。如果参数个数为空,那元祖为()。也不会出错。

2、def print_params(**params)

pring(params)    #这里(**)双星号参数的意思是,将所有关键字参数收集到字典里。如果关键字参数为空,那字典为{}。也不会出错。

5、反转过程

上节讲的是,定义函数的时候,使用参数收集*和**,将参数收集成元祖和字典。实际反过来同样有效

在函数定义的时候没有使用参数收集,但是使用函数的时候,可以使用*和**传递参数。

(*)元祖的反转 但是要注意(**)这里使用双星(**)和不使用双星(**)得到的结果一样。所以星号只在定义函数(语序使用不定数目的参数)或者调用(“分割”字典或序列)时才有用。

三、作用域

1、到底什么事变量?你可以把它看作值得名称/执行x=1赋值语句后,名称x就引用到值1。这像一个字典吧,实际就是一个不可见的字典。使用vars函数可以返回这个字典。注意vars所返回的字典是不能修改的。根据pyhon官方的说法是,结果未定义,可能得到未知结果。

这个”看不见的字典“叫做命名空间或者作用域,到底什么是命名空间?除了全局作用域外,每个函数调用都会创建一个新的作用域。

这里foo函数改变了(从绑定)了变量x,但是最后,x并没有改变。这是因为当调用foo的时候,新的命名空间就被创建了,它作用于foo内部的代码块。赋值x=42只在内部作用域(局部命名空间)起作用,所以它并不会影响外部(全局)作用域中的x。函数内部的变量成为 局部变量(local variable),与全局变量完全相反的概念。参数的工作原理类似于局部变量,所以用全局变量的名作为参数名并没有问题。

2、如何在函数内部使用全局变量。

在函数内部使用修改全局变量,可以使用global 关键字声明。注意在python3.0中引用了nonlocal关键字,他和global关键字作用类似,可以让用户在函数内部修改外部作用域(但并非全局作用域。)

四,递归

1、递归  函数可以调用自身--如果这么做了就叫递归。一切递归实现的功能都可以使用循环代替。但是使用递归函数更易读懂。

 大多数,用递归实现的,有循环实现效率更高。但是递归容易理解。

2、函数式编程

 map(func, seq [,seq])   // map函数:对序列中的每个元素,使用func函数。

filter(func,seq)    //返回函数为真的元素的列表。

reduce这个函数不常用,将序列的前两个元素相加,然后再用他们的和,同第三个元素相加。直到整个序列处理完毕。//在python3.0去掉这个函数的定义直接使用sum()

sum(seq) //返回序列中所有元素的和。

reply(func[,agrs,]) //调用函数,并提供参数。

学习资料:python基础教程

python学习笔记3_抽象的更多相关文章

  1. Python学习笔记3_数据类型

    Python数据类型:数字.字符串.列表.元祖.字典 一.数字类型:(整型.长整型.浮点型.复数型) 1.整型(int):表示范围-2,147,483,648到2,147,483,647 2.长整型( ...

  2. python学习笔记3_数据载入、存储及文件格式

    一.丛mysql数据库中读取数据 import pandas as pdimport pymysqlconn = pymysql.connect( host = '***', user = '***' ...

  3. Python学习笔记之抽象

    一.创建函数 >>> import math >>> x=1 >>> y=math.sqrt >>> callable(x) # ...

  4. 【python学习笔记】7.更加抽象

    [python学习笔记]7.更加抽象 类的定义就是执行代码块 在内存保存一个原始实例,可以通过类名来访问 类的实例化,是创建一个原始实例的副本, 并且所有成员变量与原始实例绑定 通过修改实例变量,可以 ...

  5. 【python学习笔记】6.抽象

    [python学习笔记]6.抽象 创建函数: 使用def语句定义函数,不用声明参数类型,和返回值类型 def function_name(param1, param2): 'this is docum ...

  6. python学习笔记4_类和更抽象

    python学习笔记4_类和更抽象 一.对象 class 对象主要有三个特性,继承.封装.多态.python的核心. 1.多态.封装.继承 多态,就算不知道变量所引用的类型,还是可以操作对象,根据类型 ...

  7. 【Python学习笔记之二】浅谈Python的yield用法

    在上篇[Python学习笔记之一]Python关键字及其总结中我提到了yield,本篇文章我将会重点说明yield的用法 在介绍yield前有必要先说明下Python中的迭代器(iterator)和生 ...

  8. Deep learning with Python 学习笔记(10)

    生成式深度学习 机器学习模型能够对图像.音乐和故事的统计潜在空间(latent space)进行学习,然后从这个空间中采样(sample),创造出与模型在训练数据中所见到的艺术作品具有相似特征的新作品 ...

  9. Deep learning with Python 学习笔记(4)

    本节讲卷积神经网络的可视化 三种方法 可视化卷积神经网络的中间输出(中间激活) 有助于理解卷积神经网络连续的层如何对输入进行变换,也有助于初步了解卷积神经网络每个过滤器的含义 可视化卷积神经网络的过滤 ...

随机推荐

  1. pytest进阶之html测试报告

    前言 Pytest系列已经写了几篇文章了,也不知道对多少人有帮助,总之对于我自己来说该掌握的都已经掌握了,那么今天我们再来说说pytest如何生成一个完整的html测试报告,让你在吹牛逼的路上再多一份 ...

  2. python3 文件操作练习 r+ w+ a+ 的理解

    突然来一句:“慨然有经略四方之志” 文件操作三部曲:1.先用open打开 2.再写关闭  3.再回到中间写操作     为啥要刚打开就关闭 那是很容易望,所以先写上... 基本格式 f = open( ...

  3. 从壹开始前后端分离【 .NET Core2.0 +Vue2.0 】框架之九 || 依赖注入IoC学习 + AOP界面编程初探

    更新 1.如果看不懂本文,或者比较困难,先别着急问问题,我单写了一个关于依赖注入的小Demo,可以下载看看,多思考思考注入的原理: https://github.com/anjoy8/BlogArti ...

  4. 用ASP.NET Core 2.1 建立规范的 REST API -- 保护API和其它

    本文介绍如何保护API,无需看前边文章也能明白吧. 预备知识: http://www.cnblogs.com/cgzl/p/9010978.html http://www.cnblogs.com/cg ...

  5. js简单四则运算

    作业来源 本次作业要求来自于:https://edu.cnblogs.com/campus/gzcc/GZCC-16SE1/homework/2166 我的项目GitHub远程仓库地址:https:/ ...

  6. 接口自动化:HttpClient + TestNG + Java(二) - 第一个接口测试:get请求

    在上一篇中,我们搭建好了HttpClient + TestNG + Java的自动化接口测试环境,这一篇我们就赶紧开始编写我们的第一个接口测试用例. 本篇会对问题解决的思路进行更详尽的阐述. 2.1 ...

  7. Linux最小系统移植之早期打印CONFIG_DEBUG_LL

    一.几个关键宏定义 CONFIG_DEBUG_LL. CONFIG_DEBUG_LL_INCLUDE 容我慢慢道来, 首先要使能早期打印, menuconfig必须选中CONFIG_DEBUG_LL, ...

  8. CentOS 7.4 下 如何部署 AspNetCore 结合 consul

    上篇我们讲到consul的概念,以及在WIN下如何使用:http://www.cnblogs.com/szlblog/p/9162557.html 步骤如下: 1.安装虚拟机VM 2.下载安装 Cen ...

  9. 一次快速改寫 SQL Server 高效查詢的範例

    最近線上系統突然出現匯出資料超過 10 筆時,查詢逾時的狀況,在仔細查找之後. 發現了問題原因,透過應用端與數據端兩邊同時調整,將查詢的效率提昇了約數百倍以上 首先,原本應用端的商務邏輯為每一分頁筆數 ...

  10. ABAP案例:灵活读取SAP各表的数据

    案例说明     RFC读取表中数据. Import 参数名称 Type spec. 参考打印 FIELDS_NAME1 TYPE CHAR25 TABLE_NAME1 TYPE CHAR25 WHE ...