学一门语言贵在坚持用它,不用就淡忘了,而记录下一篇文章也有助于日后快速回忆。全文分为两大部分,分别是Python基础语法和面向对象。
Python%20的创始人为吉多·范罗苏姆(Guido%20van%20Rossum)。
Python%20的设计目标:
一门简单直观的语言并与主要竞争者一样强大 开源,以便任何人都可以为它做贡献%20代码像纯英语那样容易理解 适用于短期开发的日常任务
Python%20的设计哲学:
优雅、明确、简单
Python%20开发者的哲学是:用一种方法,最好是只有一种方法来做一件事
Python%20是完全面向对象的语言,在%20Python%20中一切皆对象。
可扩展性:如果需要一段关键代码运行得更快或者希望某些算法不公开,可以把这部分程序用%20C%20或%20C++%20编写,然后在%20Python%20程序中使用它们。
执行%20Python%20程序的三种方式:解释器、交互式运行、IDE运行
Python%20是一个格式非常严格的程序设计语言。python%202.x%20默认不支持中文。
ASCII%20字符只包含%20256%20个字符,不支持中文
为了照顾现有的程序,官方提供了一个过渡版本%20—— Python%202.6。
提示:如果开发时,无法立即使用%20Python%203.0(还有极少的第三方库不支持%203.0%20的语法),建议
先使用%20Python%203.0%20版本进行开发%20然后使用%20Python%202.6、Python%202.7%20来执行,并且做一些兼容性的处理
IPython%20是一个%20python%20的 交互式%20shell,比默认的%20python%20shell%20好用得多,它支持%20bash%20shell%20命令,适合于学习/验证%20Python%20语法或者局部代码。
集成开发环境(IDE,Integrated%20Development%20Environment)—— 集成了开发软件需要的所有工具,一般包括以下工具:
PyCharm 是 Python 的一款非常优秀的集成开发环境
PyCharm运行工具栏
PyCharm 的 配置信息 是保存在 用户家目录下 的 .PyCharmxxxx.x 目录下的,xxxx.x 表示当前使用的 PyCharm 的版本号
$ rm -r ~/.PyCharm2016.3
$ tar -zxvf pycharm-professional-2017.1.3.tar.gz
/opt 目录用户存放给主机额外安装的软件
$ sudo mv pycharm-2017.1.3/ /opt/
$ cd /opt/pycharm-2017.1.3/bin
$ ./pycharm.sh
在 ubuntu 中,应用程序启动的快捷方式通常都保存在 /usr/share/applications 目录下
要卸载 PyCharm 只需要做以下两步工作:
$ sudo rm -r /opt/pycharm-2016.3.1/
$ rm -r ~/.PyCharm2016.3/
如果不再使用 PyCharm 还需要将 /usr/share/applications/ 下的 jetbrains-pycharm.desktop 删掉
让选中的程序可以执行
print("hello python") # 输出 `hello python`
为了保证代码的可读性,# 后面建议先添加一个空格,然后再编写相应的说明文字;为了保证代码的可读性,注释和代码之间 至少要有 两个空格。
"""
这是一个多行注释
在多行注释之间,可以写很多很多的内容……
"""
print("hello python")
提示:
是完成基本的算术运算使用的符号,用来处理四则运算,而“+”和“*”还可以用来处理字符串。
运算符 描述 实例 + 加 10 + 20 = 30 - 减 10 - 20 = -10 * 乘 10 * 20 = 200 / 除 10 / 20 = 0.5 // 取整除 返回除法的整数部分(商) 9 // 2 输出结果 4 % 取余数 返回除法的余数 9 % 2 = 1 ** 幂 又称次方、乘方,2 ** 3 = 8
运算符 描述 == 检查两个操作数的值是否 相等,如果是,则条件成立,返回 True != 检查两个操作数的值是否 不相等,如果是,则条件成立,返回 True > 检查左操作数的值是否 大于右操作数的值,如果是,则条件成立,返回 True < 检查左操作数的值是否 小于 右操作数的值,如果是,则条件成立,返回 True >= 检查左操作数的值是否 大于或等于 右操作数的值,如果是,则条件成立,返回 True <= 检查左操作数的值是否 小于或等于 右操作数的值,如果是,则条件成立,返回 True
Python 2.x 中判断 不等于 还可以使用 <> 运算符 != 在 Python 2.x 中同样可以用来判断 不等于
运算符 描述 实例 = 简单的赋值运算符 c = a + b 将 a + b 的运算结果赋值为 c += 加法赋值运算符 c += a 等效于 c = c + a -= 减法赋值运算符 c -= a 等效于 c = c - a *= 乘法赋值运算符 c *= a 等效于 c = c * a /= 除法赋值运算符 c /= a 等效于 c = c / a //= 取整除赋值运算符 c //= a 等效于 c = c // a %= 取 模 (余数)赋值运算符 c %= a 等效于 c = c % a **= 幂赋值运算符 c **= a 等效于 c = c ** a
身份运算符比较两个对象的内存位置。常用的有两个身份运算符,如下所述:
运算符 描述 示例 is 判断两个标识符是不是引用同一个对象 x is y,类似 id(x) == id(y) is not 判断两个标识符是不是引用不同对象 x is not y,类似 id(a) != id(b)
辨析
Python成员运算符测试给定值是否为序列中的成员。 有两个成员运算符,如下所述:
运算符 描述 in 如果在指定的序列中找到一个变量的值,则返回true,否则返回false。 not in 如果在指定序列中找不到变量的值,则返回true,否则返回false。
运算符 逻辑表达式 描述 and x and y 只有 x 和 y 的值都为 True,才会返回 True<br />否则只要 x 或者 y 有一个值为 False,就返回 False or x or y 只要 x 或者 y 有一个值为 True,就返回 True<br />只有 x 和 y 的值都为 False,才会返回 False not not x 如果 x 为 True,返回 False<br />如果 x 为 False,返回 True
运算符 描述 ** 幂 (最高优先级) * / % // 乘、除、取余数、取整除 + - 加法、减法 <= < > >= 比较运算符 == != 等于运算符 = %= /= //= -= += *= **= 赋值运算符 is is not 身份运算符 in not in 成员运算符 not or and 逻辑运算符
Python程序执行示意图
看完这篇文章,你的Python基础就差不多了# 1. 确认解释器所在位置
$ which python
# 2. 查看 python 文件大小(只是一个软链接)
$ ls -lh /usr/bin/python
# 3. 查看具体文件大小
$ ls -lh /usr/bin/python2.7
变量名 = 值
使用交互式方式,如果要查看变量内容,直接输入变量名即可,不需要使用 print 函数使用解释器执行,如果要输出变量的内容,必须要要使用 print 函数
提示:在 Python 2.x 中,整数 根据保存数值的长度还分为:
int(整数) long(长整数)
In [1]: type(name)
字符串变量 = input("提示信息:")
函数 说明 int(x) 将 x 转换为一个整数 float(x) 将 x 转换到一个浮点数 str(x) 将对象x转换为字符串表示形式 tuple(s) 将s转换为元组 list(s) 将s转换为列表
price = float(input("请输入价格:"))
格式化字符 含义 %s 字符串 %d 有符号十进制整数,%06d 表示输出的整数显示位数,不足的地方使用 0 补全 %f 浮点数,%.2f 表示小数点后只显示两位 %% 输出 %
print("格式化字符串" % 变量1)
print("格式化字符串" % (变量1, 变量2...))
Python 包含了以下内置函数:
函数 描述 备注 len(item) 计算容器中元素个数 del(item) 删除变量 del 有两种方式 max(item) 返回容器中元素最大值 如果是字典,只针对 key 比较 min(item) 返回容器中元素最小值 如果是字典,只针对 key 比较 cmp(item1, item2) 比较两个值,-1 小于 / 0 相等 / 1 大于 Python 3.x 取消了 cmp 函数
注意:字符串 比较符合以下规则: "0" < "A" < "a"。
描述 Python 表达式 结果 支持的数据类型 切片 "0123456789"[::-2] "97531" 字符串、列表、元组
面向对象编程 —— Object Oriented Programming 简写 OOP
在 Python 中 对象几乎是无所不在的,我们之前学习的 变量、数据、函数 都是对象。在 Python 中可以使用以下两个方法验证:
序号 方法名 类型 作用 01 __new__ 方法 创建对象时,会被 自动 调用 02 __init__ 方法 对象被初始化时,会被 自动 调用 03 __del__ 方法 对象被从内存中销毁前,会被 自动 调用 04 __str__ 方法 返回对象的描述信息,print 函数输出使用
提示 利用好 dir() 函数,在学习时很多内容就不需要死记硬背了。
面向对象是更大的封装,在 一个类中封装多个方法,这样通过这个类创建出来的对象,就可以直接调用这些方法了!
定义一个只包含方法的类:
class 类名:
def 方法1(self, 参数列表):
pass
def 方法2(self, 参数列表):
pass
方法 的定义格式和之前学习过的函数几乎一样,区别在于第一个参数必须是 self。注意:类名的 命名规则 要符合 大驼峰命名法。当一个类定义完成之后,要使用这个类来创建对象,语法格式如下:
对象变量 = 类名()
在面向对象开发中,引用的概念是同样适用的!
使用 print输出 对象变量,默认情况下,是能够输出这个变量 引用的对象 是 由哪一个类创建的对象,以及 在内存中的地址(十六进制表示)。
提示:在计算机中,通常使用 十六进制 表示 内存地址。
如果在开发中,希望使用 print输出 对象变量 时,能够打印 自定义的内容,就可以利用 __str__这个内置方法了:
class Cat:
def __init__(self, new_name):
self.name = new_name
print("%s 来了" % self.name)
def __del__(self):
print("%s 去了" % self.name)
def __str__(self):
return "我是小猫:%s" % self.name
tom = Cat("Tom")
print(tom)
注意:__str__方法必须返回一个字符串。
在 Python 中,要 给对象设置属性,非常的容易,只需要在 类的外部的代码 中直接通过 对象.设置一个属性即可,但是不推荐使用:
看完这篇文章,你的Python基础就差不多了class Cat:
"""这是一个猫类"""
def eat(self):
print("小猫爱吃鱼")
def drink(self):
print("小猫在喝水")
tom = Cat()
# 给对象设置属性
tom.name = "Tom"
因为:对象属性的封装应该封装在类的内部
由哪一个对象调用的方法,方法内的 self就是哪一个对象的引用
__init__ 方法是 专门 用来定义一个类具有哪些属性的方法!
class Cat:
def __init__(self, name):
print("初始化方法 %s" % name)
self.name = name
...
tom = Cat("Tom")
...
lazy_cat = Cat("大懒猫")
...
应用场景
定义方式
私有属性和私有方法
伪私有属性和私有方法Python 中,并没有 真正意义 的 私有在给 属性、方法 命名时,实际是对名称做了一些特殊处理,使得外界无法访问到处理方式:在 名称 前面加上_类名 => _类名__名称
# 私有属性,外部不能直接访问到
print(xiaofang._Women__age)
# 私有方法,外部不能直接调用
xiaofang._Women__secret()
提示:在日常开发中,不要使用这种方式,访问对象的 私有属性 或 私有方法。
面向对象三大特性:
继承的概念:子类 拥有 父类 以及 父类的父类 中封装的所有 属性 和 方法。
class 类名(父类名):
pass
当 父类 的方法实现不能满足子类需求时,可以对方法进行重写(override)重写 父类方法有两种情况:
调用父类方法的另外一种方式:在 Python 2.x 时,如果需要调用父类的方法,还可以使用以下方式:父类名.方法(self)。目前在 Python 3.x 还支持这种方式,但不推荐使用,因为一旦 父类发生变化,方法调用位置的 类名 同样需要修改。
子类对象 不能 在自己的方法内部,直接 访问 父类的 私有属性 或 私有方法子类对象 可以通过 父类 的 公有方法 间接 访问到 私有属性 或 私有方法
私有属性、方法 是对象的隐私,不对外公开,外界 以及 子类 都不能直接访问 私有属性、方法 通常用于做一些内部的事情
子类 可以拥有 多个父类,并且具有 所有父类 的 属性 和 方法,例如:孩子 会继承自己 父亲 和 母亲 的 特性。
class 子类名(父类名1, 父类名2...):
pass
MRO 是 method resolution order —— 方法搜索顺序,主要用于 在多继承时判断 方法、属性 的调用 路径
在 Python 3.x 中定义类时,如果没有指定父类,会 默认使用 object作为该类的 基类 —— Python 3.x 中定义的类都是 新式类,在 Python 2.x 中定义类时,如果没有指定父类,则不会以 object 作为 基类。
class 类名(object):
pass
object 是 Python 为所有对象提供的 基类,提供有一些内置的属性和方法,可以使用 dir(object) 函数查看。
面向对象三大特性:
多态 更容易编写出出通用的代码,做出通用的编程,以适应需求的不断变化!
案例:在 Dog 类中封装方法 game:普通狗只是简单的玩耍定义 XiaoTianDog 继承自 Dog,并且重写 game 方法:哮天犬需要在天上玩耍定义 Person 类,并且封装一个 和狗玩 的方法:在方法内部,直接让 狗对象 调用 game 方法
多态示例
Person 类中只需要让 狗对象 调用 game 方法,而不关心具体是 什么狗。
通常会把:创建出来的 对象 叫做 类的实例创建对象的 动作 叫做 实例化对象的属性 叫做 实例属性对象调用的方法 叫做 实例方法每一个对象 都有自己独立的内存空间,保存各自不同的属性多个对象的方法,在内存中只有一份,在调用方法时,需要把对象的引用传递到方法内部
各个不同的属性,独一份的方法
在 Python 中,类是一个特殊的对象。
Python 中 一切皆对象:
class AAA: 定义的类属于 类对象 obj1 = AAA() 属于 实例对象
在程序运行时,类同样会被加载到内存在程序运行时,类对象在内存中只有一份,使用 一个类可以创建出很多个对象实例除了封装实例的属性和方法外,类对象还可以拥有自己的属性和方法——类属性、类方法,通过 类名. 的方式可以 访问类的属性 或者 调用类的方法
类的结构
类属性 就是 类对象中定义的属性通常用来记录与这个类相关的特征类属性不会用于记录具体对象的特征示例:定义一个 工具类,每件工具都有自己的 name:需求 —— 知道使用这个类,创建了多少个工具对象?
在 Python 中 属性的获取 存在一个 向上查找机制
因此,要访问类属性有两种方式:
语法如下
@classmethod
def 类方法名(cls):
pass
示例
@classmethod
def show_tool_count(cls):
"""显示工具对象的总数"""
print("工具对象的总数 %d" % cls.count)
语法如下
@staticmethod
def 静态方法名():
pass
示例:
探索:
重写 __new__ 方法 的代码非常固定!
需求
解决办法
1、Python 能够自动的将一对括号内部的代码连接在一起:
'''
**需求**
* 定义 `input_password` 函数,提示用户输入密码
* 如果用户输入长度 < 8,抛出异常
* 如果用户输入长度 >=8,返回输入的密码
'''
def input_password():
# 1. 提示用户输入密码
pwd = input("请输入密码:")
# 2. 判断密码长度,如果长度 >= 8,返回用户输入的密码
if len(pwd) >= 8:
return pwd
# 3. 密码长度不够,需要抛出异常
# 1> 创建异常对象 - 使用异常的错误信息字符串作为参数
ex = Exception("密码长度不够")
# 2> 抛出异常对象
raise ex
try:
user_pwd = input_password()
print(user_pwd)
except Exception as result:
print("发现错误:%s" % result)
2、一个对象的 属性 可以是 另外一个类创建的对象。3、在__init__方法中定义类的属性时,如果 不知道设置什么初始值,可以设置为 None):None 关键字 表示 什么都没有,表示一个 空对象,没有方法和属性,是一个特殊的常量。可以将 None 赋值给任何一个变量。
在 Python 中针对 None 比较时,建议使用is 判断
4、eval() 函数十分强大 —— 将字符串 当成 有效的表达式 来求值 并 返回计算结果
在开发时千万不要使用 eval 直接转换 input 的结果,举个例子:
看完这篇文章,你的Python基础就差不多了__import__('os').system('ls')
# 等价代码
import os
os.system("终端命令")