Python学习笔记

Python内置函数

  • id():返回对象的内存地址,返回值是只读的,不可修改
  • type():返回对象的数据类型
  • divmod(x,y):用于实现数学里的除法运算。第一个参数表示被除数,第二个参数表示除数,返回值为(a,b)形式,其中a表示商,b表示余数
  • round(x,y):实现对小数的四舍五入功能,第二个参数表示四舍五入过后保留几位小数
  • abs(x):求指定数字的绝对值
  • str(x):将数字转换成字符串,同理还有int()函数用于将字符串转换成数字
  • dir(模块名):查看指定模块中包含的可调用的函数名称
  • help(模块名.函数名):查阅指定函数的使用说明文档,例如:help(math.sin)

Python中的变量

Python里的变量没有数据类型,或者说Python里的变量的数据类型是可以随时动态变更,这点跟Java里的变量有所区别。因此,我们可以理解为Python里的变量数据类型为弱类型。

Python中的数字虽然也有长整型、短整型之类的区分,但是编程人员无需考虑该用长整型还是短整型,Python会自动根据您提供的数字进行数据类型推断以及必要的数据类型转换,以避免一些可能发生的数据类型溢出问题。

Python中的数字精度

Python中的浮点数计算同样会存在小数表示精度问题,这不仅仅只有Python中存在这种问题,所有编程语言基本都存在这种问题。在Python中,解决数字计算精度问题,你可能需要如下几个解决方案:

  1. decimal模块
  2. Numerical包

Python导入模块

Python里的导入模块类似于Java里的导入类的概念

  • import 模块名1,模块名2,模块名3……模块名N
  • from 父模块名 import 子模块名

Python中的注释

  • 单行注释,用#开头,而Java里以双斜杠//开头

  • 多行注释,使用一对3个单引号或一对3个双引号,例如:

    ‘’’
    这里是多行注释

    ‘’’

    或者
    “””
    这里是多行注释

    “””

Python中的文件编码

在文件中添加如下一行代码即可:

1
2
#coding=utf-8
# -*- coding:utf-8 -*-

Python中str()与repr()的区别

  • 相同点:两者都能将指定的对象转换成字符串形式
  • 不同点:str()函数主要用于将对象转换成对用户友好的字符串形式,而repr()函数主要用于将对象转换成对编译器友好的字符串表达式。

Python中的进制表示形式

  • 二进制是以0b开头的,例如: 0b11。不过在Java里,不支持直接表示二进制
  • 8进制是以0开头,例如011。与Java相同
  • 16进制是以0x开头,例如0x6A。与Java相同

Python中的字符转义

  • Python中也是使用反斜杠\字符进行特殊字符转义,这点跟Java类似
  • 另外反斜杠字符也可以用于字符串表象上的换行显示,但实际输出还是单行的显示效果

Python的算术运算符

  1. 两个星号**表示幂运算
  2. 一个斜杠/表示数学里的除法运算,比如1/8=0.125
  3. 两个斜杠//表示整除运算,只会返回商的整数部分,比如1//8=0
  4. 一个%表示模除运算,只会返回除法的余数,比如1%8=1

Python的逻辑运算符

使用and/or/not这3个单词表示,Java里对应使用的是&&、||、!

Python中的三目运算

  • a = X if 布尔表达式 else Z
  • Java中的三目运算写法为(布尔表达式)? X : Z

Python中如何判断两个对象是否为同一个对象

  • 所谓同一个对象即两个对象的内存地址相同
  • 判断两个对象是否相同需要使用is运算符,比如a is b或者a is not b
  • Python里的is相当于Java里的\=\=符号,而Python里的==符号等于Java里Object对象的equals()函数

Python中如何判断一个元素是否包含于某个集合内

  • 你需要使用in或not in来解决此类问题,而在Java里我们需要for或while遍历一遍
  • in关键字的使用示例:a in b,表示含义为a是否包含于集合b内,若返回True即表示包含,否则就是不包含

Python中的List

类似Java里的List,Python里没有数组,或者可以理解为Python中的List将Java里的数组和List合二为一了。Python中的List定义形式为:[a,b,c,d,e,f,g],List里每个元素的数据类型没有任何限制。

Python中的Tuple

Tuple与List有点类似,最大区别就是List是可变的,而Tuple对象是不可变的,即Tuple的元素定义过后就不能再修改。Python中的Tuple定义形式为(a,b,c,d,e,f,g),Tuple里每个元素的数据类型没有任何限制。

Python中的Dict

  • Python中的Dict数据类型本质就是一个Hash表数据结构,类似于Java里的Map结构
  • Python中的Dict定义形式为{key:value}

Python中的Set

  • Python中的Set集合类似于Java中的Set集合,但也有不同。
  • Python中的Set集合是无序自带去重特性的集合
  • Python中的Set集合定义形式为{a,b,c,d,e,f,g}
  • 定义一个空Set集合,只能使用set(),不能使用空的{}表示

Python中的条件语句

1
2
3
4
if 布尔表达式:
语句
else:
语句

if 条件语句也可以用于赋值,实现类似Java中的三目运算,例如:a=X if 布尔表达式 else Z

Python中的循环语句

  1. for循环

    1
    2
    for 变量 in 集合:
    语句
    1
    2
    3
    for m,n in enumerate(集合):
    # m表示当前元素在集合中的索引值,n表示当前元素的值
    print(str(m) + ' ' + str(n))
  2. while循环

    1
    2
    while 布尔表达式:
    语句
  3. break,continue关键字,懂Java的都知道

  4. pass关键字,表示空操作,相当于什么都不做即do nothing

Python中的函数

Python中的函数定义语法
1
2
3
def 函数名称 ([参数1,][参数2,][参数3,] ... ...[参数N]):
函数体
return 返回值

从Python中的函数定义语法来看,我们至少可以得知以下结论:

  • Python中的函数不需要显式的声明返回值类型
  • Python中的函数返回值类型只有在函数运行时才能确定,也就是说函数的返回值类型是动态的,不像Java中那样需要提前固定函数的返回值类型,在这一点上,Python设计得显然更人性化一些。
  • Python中的函数的参数无需显式声明数据类型,从这一点同样可以看出,Python确实是一门弱类型编程语言。
  • Python还支持将表达式语句作为参数传入函数
Python中的函数调用语法
1
函数名称([参数1,][参数2,][参数3,] ... ...[参数N])

上面的这种函数调用方式是按照参数位置顺序进行实际参数绑定,即传入的实际参数需要与函数的参数实际定义位置顺序保持一致。

1
函数名称(参数名1=参数值1,参数名2=参数值2,参数名3=参数值3......参数名N=参数值N)

上面这种函数调用方式是按照参数名称进行实际参数绑定,这样就可以无视函数参数的实际定义顺序,只要参数名称书写无误即可完成参数赋值。如果同时应用两种函数调用方式,那么位置参数应该放置在命名参数的前面。

Python中的函数的参数指定默认值
1
2
3
def 函数名称 ([参数1=默认值,][参数2,][参数3=默认值,] ... ...[参数N]):
函数体
return 返回值
Python中函数的不定参

在Java中,函数的不定参是用Object… args来实现的,而在Python中函数的不定参是使用一个星号*或者两个星号**来实现。一个星号*表示Tuple类型,两个星号**表示Dict类型。

Python中的匿名函数定义语法
1
lambda 参数1,参数2,参数3,......参数N: 语句

注意:Python中的匿名函数只能有一个语句,该语句的最终执行结果将作为该匿名函数的返回值,你不能显式的使用return关键字。

Python中的变量作用域
  • Python中变量的作用域是根据函数定义的位置来决定

  • 若变量定义在函数内部,则该变量只能在该函数内部才能被访问

  • 若变量定义在函数的外部,则该变量属于该文件内部的全局变量,在该文件内部全局可见

  • 若函数内部定义了跟全局变量同名的局部变量,则在函数内部实际操作的还是函数内部的局部变量,对函数局部变量的操作,不会影响到全局变量

  • 若函数内部未定义跟全局变量同名的局部变量,那么你只能访问到全局变量而不能对其进行修改。若需要在函数内部修改全局变量,那么你需要在函数内部使用global关键字声明该全局变量,示例如下:

    1
    2
    3
    4
    5
    6
    7
    8
    a = 10
    def foo():
    global a
    a=20
    print(a)

    foo()
    print(a)

Python中的面向对象

类的定义语法
1
2
3
4
5
6
7
8
9
10
11
12
class 类名称:
类公有属性名称[=属性默认值]
__类私有属性名称[=属性默认值]
def __init__(self,对象属性名称1,对象属性名称2,对象属性名称3......对象属性名称N):
self.对象属性名称1
self.对象属性名称2
self.对象属性名称3
... ...
self.对象属性名称N

def 函数名称(参数1,[参数2,][参数3,]......[参数N]):
函数体
  • Python中类的属性分两个类别:类属性和对象属性
  • 类属性是每个对象都拥有的属性。顾名思义,对象属性就是某些或某个对象拥有的属性,也就是说,在Python中,每个对象拥有的属性不一定相同。
  • 当类属性与对象属性同名时,对象属性的优先级要高于类属性
  • Python中类属性还分类公共属性和类私有属性,类私有属性就相当于Java里被private修饰符修饰的属性,类私有属性必须以两个下划线开头。类公共属性类似于Java里被static修饰符修饰的属性,即Python里的类公有属性可以直接通过类名直接访问。
  • Python里类的构造函数名称统一固定命名为__init__,而且构造函数的第一个参数表示当前对象,相当于Java类里面的this关键字。Python里一般用self表示当前对象,但第一个参数的名称可以随意自定义。
  • 定义在类构造函数内的属性叫做对象属性
  • Python中对象属性是可以动态绑定的,也就是说,在Pythobn中同一个类创建出来的两个对象可能拥有不同的属性。
  • Python中类的方法分3个类别:普通方法、类方法和静态方法。
  • Python中类的静态方法不可以访问类属性,类似于Java中类的静态方法。静态方法支持直接通过类名来调用,当然也支持通过对象来调用。
  • Python中类的类方法可以访问类属性,第一个参数必须表示当前类。类方法支持直接通过类名来调用,当然也支持通过对象来调用。
  • Python中类的普通方法可以访问当前对象的属性,只能通过对象来调用,并且第一个参数必须表示当前对象,类似于Java中类的普通方法。
  • Python中的类方法需要在方法头上添加@classmethod注解,静态方法需要在方法头上添加@staticmethod注解。

下面是Python中类的方法的使用示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
class Tst:
name = 'tst'
data = 'this is data'

# 普通方法,可以访问对象属性,只能通过对象来调用普通方法
def normalMethod(self, name):
print(self.data + name)

# 类方法,可以访问类属性,可以通过类名或对象来调用静态方法
@classmethod
def classMethod(cls, name):
print(cls.data, name)

# 静态方法,不可以访问类属性,可以通过类名或对象来调用静态方法
@staticmethod
def staticMethod(name):
print(name)
Python中类的继承
1
class 类名称(父类1[,父类2],...[父类N]):
  • Python中的类继承支持多继承
  • Python中的类分经典类和新式类两种,若当前类或当前类的父类继承了object类,则该类属于新式类。否则就是经典类。
  • 经典类在查找函数时,在类多继承的情况下,会按照深度优先方式查找函数。
  • 新式类在查找函数时,在类多继承的情况下,会按照广度优先方式查找函数。
Python中类的多态

Python中不支持面向对象中的多态特性,因为Python推崇”鸭子类型”。Python本身就是一门动态编程语言,它的变量的数据类型是动态的,所以Python天生就不需要支持多态。

Python中的属性装饰器

所谓属性装饰器,其实就是将对属性常见的读取属性值、更新属性值、删除属性的几种操作通过几组内置注解或者property构造器映射到类的自定义普通函数上。比如读取属性值操作,你可以通过为任意方法添加@property注解,那么该方法的返回值就当做属性值返回给用户。比如当你通过product.price获取对象的price属性值数据的时候,Python会自动在product对象对应的类中查找名称为price的函数并且该函数头上含有@property注解,那么就执行该函数,最终返回该函数的返回值。同理更新属性值,你需要为函数头上添加@属性名.setter注解,删除属性的话,那么你需要为函数头上添加@属性名.deleter。

除了注解,第二种实现方式就是property构造器,property的构造器需要接收4个参数:

  • 第一个参数是方法名,调用 对象.属性 时自动触发执行方法
  • 第二个参数是方法名,调用 对象.属性 = XXX 时自动触发执行方法
  • 第三个参数是方法名,调用 del 对象.属性 时自动触发执行方法
  • 第四个参数是字符串,调用 对象.属性.__doc__ ,此参数是该属性的描述信息

但是property构造器这种方式相当于是将一些指定的普通函数转换成类属性,而采用注解这种方式相当于将一些指定的普通函数转换成对象属性。

简而言之,Python里的属性装饰器本质就是将普通函数转换成属性。注意:这里涉及到的函数指的都是普通函数。

Python中的包

首先需要理解,Python中的模块概念,类似于Java里的类,也就是说,Python里的一个模块,相当于Java里的一个类。为了避免模块名冲突,所以,Python同样引入了包(英文术语叫Package)的概念来组织管理各种模块。

  • Python的每个包下必须要有一个__init__.py文件,执行一个包,相当于执行该包下的__init__.py

  • Python搜索包的默认路径为Python安装目录下的Lib\site-packages。你可以将自己编写的模块路径放到环境变量PYTHONPATH 中,Python会自动将PYTHONPATH环境变量追加到sys.path中。当然你也可以直接将你自己编写的模块路径追加到sys.path中,比如:

    1
    sys.path.append(你的模块绝对路径)
  • 你可以选择在Python安装目录下的Lib\site-packages目录下新建一个后缀为.pth的文件,在该文件里填写上你需要加载的模块的绝对路径即可,Python会自动根据你提供的.pth文件帮你加载这些模块,这样你后续就能通过import关键字导入那些模块。但是我还是推荐你使用上面往sys.path中追加模块路径的编程方式。

  • 导入模块常用语法为import 包名.模块名,注意:Python中的import语句不要求必须放在文件顶部

  • 查找Python中常用的一些开源的代码包,可以访问:https://pypi.org/

  • Python里库的概念相当于Java里的jar。在Python中,具有某些功能的模块和包就可以被称作”库”。比如Numpy。当然也有人将其叫做Numpy包,两者都可以,因为Python中的库本身就没有特别明确的定义。

Copyright © 2018 - 2018 Lanxiaowei All Rights Reserved.

UV : | PV :