简明 Python 教程:笔记

明了胜过晦涩,显式优于隐式

散装 python:

1、python3.6中为了数字的显示方便,增加了数字的千分位符,如下,可以用横线来分割数字:

a = 368934881474191032321
b = 368_934_881_474_191_032_321
c = 123.456_789
print(a == b)  # True
print(c)       # 123.456789

2、Python 中的 pass 语句用于指示一个没有内容的语句块

Python深拷贝和浅拷贝

直接赋值:其实就是对象的引用(别名)。

浅拷贝(copy):

拷贝父对象,不会拷贝对象的内部的子对象。
a = [1, [1,2,3]]
b = a.copy()
a.append(4)
print("a = ", a)
print("b = ", b)
a[1].append(5)
print("a = ", a)
print("b = ", b)

answer:
a =  [1, [1, 2, 3], 4]
b =  [1, [1, 2, 3]]
a =  [1, [1, 2, 3, 5], 4]
b =  [1, [1, 2, 3, 5]]


深拷贝(deepcopy):

copy 模块的 deepcopy 方法,完全拷贝了父对象及其子对象。
import copy
a = [1, [1,2,3]]
b = copy.deepcopy(a)
a.append(4)
print("a = ", a)
print("b = ", b)
a[1].append(5)
print("a = ", a)
print("b = ", b)


answer:
a =  [1, [1, 2, 3], 4]
b =  [1, [1, 2, 3]]
a =  [1, [1, 2, 3, 5], 4]
b =  [1, [1, 2, 3]]
 

Python的解释性:

Python 不需要将其编译成二进制码。你只需要直接从源代码运行该程序。 在程序内部, Python 会将源代码转换为称为字节码的中间形式, 尔后再转换成你的电脑所使用的语言,并运行它。

Python 同时支持面向过程编程与面向对象编程。
 

没有单独的 long 类型,int 类型可以指任何大小的整数。
 

被双引号包括的字符串和被单引号括起的字符串其工作机制完全相同
 

你可以通过使用三个引号—— """ 或 ''' 来指定多行字符串
 

回调函数:

https://www.zhihu.com/question/19801131

应用程序(application program)会时常通过API调用库里所预先备好的函数。但是有些库函数(library function)却要求应用先传给它一个函数,好在合适的时候调用,以完成目标任务。这个被传入的、后又被调用的函数就称为回调函数(callback function)。

打个比方,有一家旅馆提供叫醒服务,但是要求旅客自己决定叫醒的方法。可以是打客房电话,也可以是派服务员去敲门,睡得死怕耽误事的,还可以要求往自己头上浇盆水。这里,“叫醒”这个行为是旅馆提供的,相当于库函数,但是叫醒的方式是由旅客决定并告诉旅馆的,也就是回调函数。而旅客告诉旅馆怎么叫醒自己的动作,也就是把回调函数传入库函数的动作,称为登记回调函数(to register a callback function)。

可以看到,回调函数通常和应用处于同一抽象层(因为传入什么样的回调函数是在应用级别决定的)。而回调就成了一个高层调用底层,底层再过头来用高层的过程。

回调函数的优势:

回调机制提供了非常大的灵活性,我们把图中的库函数改称为中间函数。在回调中,我们利用某种方式,把回调函数像参数一样传入中间函数。可以这么理解,在传入一个回调函数之前,中间函数是不完整的。换句话说,程序可以在运行时,通过登记不同的回调函数,来决定、改变中间函数的行为。

运行结果:

上面的代码里,给`getOddNumber`传入不同的回调函数,它的表现也不同,这就是回调机制的优势所在。

Python可变参数:

定义的函数里面能够有任意数量的变量,也就是参数数量是可变的,这可以通过使用星号来实现:

当我们声明一个诸如 *param 的星号参数时, 从此处开始直到结束的所有位置参数( Positional Arguments) 都将被收集并汇集成一个称为“param”的元组( Tuple) 。
类似地, 当我们声明一个诸如 **param 的双星号参数时, 从此处开始直至结束的所有关键字参数都将被收集并汇集成一个名为 param 的字典( Dictionary)。

DocStrings:文档字符串

函数的第一行逻辑行中的字符串是该函数的 文档字符串( DocString) 。该文档字符串所约定的是一串多行字符串, 其中第一行以某一大写字母开始, 以句号结束。
第二行为空行, 后跟的第三行开始是任何详细的解释说明。 在此强烈建议你在你所有重要功
能的所有文档字符串中都遵循这一约定。
我们可以通过使用函数的 __doc__ ( 注意其中的双下划綫) 属性( 属于函数的名称) 来获取
函数 print_max 的文档字符串属性。
 

面向对象---类 、属性:

https://www.runoob.com/python/python-object.html

围绕函数设计我们的程序,也就是那些能够处理数据的代码块,这被称作面向过程的编程方式。
将数据与功能进行组合,并将其包装在被称作“对象”的东西内,这被称作面向对象的编程方式。

类(Class): 用来描述具有相同的属性的对象的集合。它定义了该集合中每个对象所共有的属性。对象是类的实例。类与对象是面向对象编程的两个主要方面。一个类( Class)能够创建一种新的类型( Type),其中对象( Object)就是类的实例( Instance)。字段与方法通称类的属性。

继承:即一个派生类(derived class)继承基类(base class)的字段和方法。

字段:对象可以使用属于它的普通变量来存储数据,这种从属于对象或类的变量叫作字段。

字段( Field) 有两种类型——类变量与对象变量, 它们根据究竟是类还是对象拥有这些变量
来进行分类。
类变量( Class Variable) 是共享的( Shared) ——它们可以被属于该类的所有实例访问。
该类变量只拥有一个副本, 当任何一个对象对类变量作出改变时, 发生的变动将在其它所有
实例中都会得到体现。
对象变量( Object variable) 由类的每一个独立的对象或实例所拥有,它们不会被共享。

方法:对象还可以使用属于类的函数来实现某些功能,这种函数叫作类的方法。

这两个术语很重要,它有助于我们区分函数与变量,哪些是独立的,哪些又是属于类或对象的。总之,字段与方法通称类的属性( Attribute)。

class Employee:
   '所有员工的基类'
   empCount = 0
 
   def __init__(self, name, salary):
      self.name = name
      self.salary = salary
      Employee.empCount += 1
   
   def displayCount(self):
     print "Total Employee %d" % Employee.empCount
 
   def displayEmployee(self):
      print "Name : ", self.name,  ", Salary: ", self.salary

empCount 变量是一个类变量,它的值将在这个类的所有实例之间共享。你可以在内部类或外部类使用 Employee.empCount 访问。

name等为实例变量,属于对象。

第一种方法__init__()方法是一种特殊的方法,被称为类的构造函数或初始化方法,当创建了这个类的实例时就会调用该方法。__init__ 方法会在类的对象被实例化( Instantiated)时立即运行。

self

self 在定义类的方法时是必须有的,虽然在调用时不必传入相应的参数(自动转换),self 引用对象本身

类方法与普通函数只有一种特定的区别——前者必须多加一个参数在参数列表开头,这个名
字必须添加到参数列表的开头,但是你不用在你调用这个功能时为这个参数赋值, Python 会
为它提供。这种特定的变量引用的是对象本身,按照惯例,它被赋予 self 这一名称。

模块

那么如果你想在你所编写的别的程序中重用一些函数的话,就用模块。

sys:

当 Python 运行 import sys 这一语句时,它会开始寻找 sys 模块。由于其是一个内置模块,因此 Python 知道应该在哪里找到它。 如果它不是一个已编译好的模块,即用 Python 编写的模块,那么 Python 解释器将从它的 sys.path 变量所提供的目录中进行搜索。

sys.argv 变量是一系列字符串的列表。 sys.argv 包含了命令行参数(Command Line Arguments)这一列表,也就是使用命令行传递给你的程序的参数。

当我们运行 python module_using_sys.py we are arguments 时,我们通过 python 命 令来运行 module_using_sys.py 模块,后面的内容则是传递给程序的参数。 Python 将命令行 参数存储在 sys.argv 变量中供我们使用。 要记住的是,运行的脚本名称在 sys.argv 的列表中总会位列第一。因此,在这一案例中我们将会有如下对应关系: 'module_using_sys.py' 对应 sys.argv[0] , 'we' 对应 sys.argv[1] , 'are' 对应 sys.argv[2] , 'arguments' 对应 sys.argv[3] 。

sys.path 内包含了导入模块的字典名称列表。你能观察到 sys.path 的第一段字符串是空的 ——这一空字符串代表当前目录也是 sys.path 的一部分。

自定义模块:

每个python程序都是一个模块,只要它以 .py 结尾。

内置的 dir() 函数能够返回由对象所定义的名称列表。 如果这一对象是一个模块,则该列表会包括函数内所定义的函数、类与变量。

包(Packages)

组织你的程序的层次结构:组织模块。

变量通常位于函数内部,函数与全局变量通常位于模块内部。

是指一个包含模块与一个特殊的 __init__.py 文件的文件夹,后者向 Python 表明这一文 件夹是特别的,因为其包含了 Python 模块。

是一种能够方便地分层组织模块的方式。

函数是程序中的可重用部分,模块是一种可重用的程序,包是用以组织模块的另一种层次结构。

数据结构

Python 中有四种内置的数据结构——列表(List)、元组(Tuple)、字典(Dictionary)和集合(Set)。

元组(Tuple)用于将多个对象保存到一起,你可以将它们近似地看作列表,但是它是不可变的。

序列:与列表操作方式相似,可以这样访问内部的元组、列表与字符串。

eg: shoplist = ['apple', 'mango', 'banana']

集合( Set) 是简单对象的无序集合( Collection) 。 当集合中的 项目存在与否 比起次序或其出
现次数更加重要。

列表引用

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值