|
前言 学一门语言贵在坚持用它,不用就淡忘了,而记录下一篇文章也有助于日后快速回忆。全文分为两大部分,分别是Python基础语法和面向对象。 第一部分 Python基础语法
第一部分 Python基础语法 1. 认识Python1.1 Python 简介Python 的创始人为吉多·范罗苏姆(Guido van Rossum)。
Python 是完全面向对象的语言,在 Python 中一切皆对象。 1.2. 第一个Python程序 执行 Python 程序的三种方式:解释器、交互式运行、IDE运行 Python 是一个格式非常严格的程序设计语言。python 2.x 默认不支持中文。
为了照顾现有的程序,官方提供了一个过渡版本 —— Python 2.6。
IPython 是一个 python 的 交互式 shell,比默认的 python shell 好用得多,它支持 bash shell 命令,适合于学习/验证 Python 语法或者局部代码。 集成开发环境(IDE,Integrated Development Environment)—— 集成了开发软件需要的所有工具,一般包括以下工具:
PyCharm 是 Python 的一款非常优秀的集成开发环境
PyCharm运行工具栏 1.3. PyCharm 的设置PyCharm 的 配置信息 是保存在 用户家目录下 的 .PyCharmxxxx.x 目录下的,xxxx.x 表示当前使用的 PyCharm 的版本号 1.3.1 恢复 PyCharm 的初始设置:
$ sudo mv pycharm-2017.1.3/ /opt/
1.3.4 卸载之前版本的 PyCharm 要卸载 PyCharm 只需要做以下两步工作:
1.4. 多文件项目的演练
让选中的程序可以执行 2. 注释
2.2 多行注释(块注释)
这是一个多行注释 在多行注释之间,可以写很多很多的内容…… """ 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 3.2 比较(关系)运算符运算符 描述 == 检查两个操作数的值是否 相等,如果是,则条件成立,返回 True != 检查两个操作数的值是否 不相等,如果是,则条件成立,返回 True > 检查左操作数的值是否 大于右操作数的值,如果是,则条件成立,返回 True < 检查左操作数的值是否 小于 右操作数的值,如果是,则条件成立,返回 True >= 检查左操作数的值是否 大于或等于 右操作数的值,如果是,则条件成立,返回 True <= 检查左操作数的值是否 小于或等于 右操作数的值,如果是,则条件成立,返回 True 3.3 赋值运算符
运算符 描述 实例 = 简单的赋值运算符 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 3.4 身份运算符身份运算符比较两个对象的内存位置。常用的有两个身份运算符,如下所述: 运算符 描述 示例 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。 3.6 逻辑运算符运算符 逻辑表达式 描述 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 3.7 运算符优先级
运算符 描述 ** 幂 (最高优先级) * / % // 乘、除、取余数、取整除 + - 加法、减法 <= < > >= 比较运算符 == != 等于运算符 = %= /= //= -= += *= **= 赋值运算符 is is not 身份运算符 in not in 成员运算符 not or and 逻辑运算符 <补>程序执行原理
Python程序执行示意图
$ which python # 2. 查看 python 文件大小(只是一个软链接) $ ls -lh /usr/bin/python # 3. 查看具体文件大小 $ ls -lh /usr/bin/python2.74. 变量4.1 变量定义
4.2 变量的类型
函数 说明 int(x) 将 x 转换为一个整数 float(x) 将 x 转换到一个浮点数 str(x) 将对象x转换为字符串表示形式 tuple(s) 将s转换为元组 list(s) 将s转换为列表 price = float(input("请输入价格:"))<补>格式化输出:print
格式化字符 含义 %s 字符串 %d 有符号十进制整数,%06d 表示输出的整数显示位数,不足的地方使用 0 补全 %f 浮点数,%.2f 表示小数点后只显示两位 %% 输出 %
print("格式化字符串" % (变量1, 变量2...))4.4.5 公共方法和变量的高级应用4.4.5.1 内置函数 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"。 4.4.5.2 切片描述 Python 表达式 结果 支持的数据类型 切片 "0123456789"[::-2] "97531" 字符串、列表、元组
面向对象编程 —— Object Oriented Programming 简写 OOP
在 Python 中 对象几乎是无所不在的,我们之前学习的 变量、数据、函数 都是对象。在 Python 中可以使用以下两个方法验证:
序号 方法名 类型 作用 01 __new__ 方法 创建对象时,会被 自动 调用 02 __init__ 方法 对象被初始化时,会被 自动 调用 03 __del__ 方法 对象被从内存中销毁前,会被 自动 调用 04 __str__ 方法 返回对象的描述信息,print 函数输出使用 提示 利用好 dir() 函数,在学习时很多内容就不需要死记硬背了。 2.2 定义简单的类(只包含方法)
定义一个只包含方法的类: 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) 2.3 方法中的 self 参数 在 Python 中,要 给对象设置属性,非常的容易,只需要在 类的外部的代码 中直接通过 对象.设置一个属性即可,但是不推荐使用: class Cat:"""这是一个猫类""" def eat(self): print("小猫爱吃鱼") def drink(self): print("小猫在喝水") tom = Cat() # 给对象设置属性 tom.name = "Tom" 因为:对象属性的封装应该封装在类的内部
def __init__(self, name): print("初始化方法 %s" % name) self.name = name ... tom = Cat("Tom") ... lazy_cat = Cat("大懒猫") ...2.5 私有属性和私有方法 应用场景
定义方式
私有属性和私有方法 伪私有属性和私有方法Python 中,并没有 真正意义 的 私有在给 属性、方法 命名时,实际是对名称做了一些特殊处理,使得外界无法访问到处理方式:在 名称 前面加上_类名 => _类名__名称 # 私有属性,外部不能直接访问到print(xiaofang._Women__age) # 私有方法,外部不能直接调用 xiaofang._Women__secret() 3. 封装、继承和多态 面向对象三大特性:
继承的概念:子类 拥有 父类 以及 父类的父类 中封装的所有 属性 和 方法。 class 类名(父类名):pass 当 父类 的方法实现不能满足子类需求时,可以对方法进行重写(override)重写 父类方法有两种情况:
父类的 私有属性 和 私有方法 子类对象 不能 在自己的方法内部,直接 访问 父类的 私有属性 或 私有方法子类对象 可以通过 父类 的 公有方法 间接 访问到 私有属性 或 私有方法 3.1.2 多继承 子类 可以拥有 多个父类,并且具有 所有父类 的 属性 和 方法,例如:孩子 会继承自己 父亲 和 母亲 的 特性。 class 子类名(父类名1, 父类名2...):passPython 中的 MRO算法(Method Resolution Order)
新式类与旧式(经典)类
pass 3.2 多态 面向对象三大特性:
案例:在 Dog 类中封装方法 game:普通狗只是简单的玩耍定义 XiaoTianDog 继承自 Dog,并且重写 game 方法:哮天犬需要在天上玩耍定义 Person 类,并且封装一个 和狗玩 的方法:在方法内部,直接让 狗对象 调用 game 方法
多态示例 Person 类中只需要让 狗对象 调用 game 方法,而不关心具体是 什么狗。 通常会把:创建出来的 对象 叫做 类的实例创建对象的 动作 叫做 实例化对象的属性 叫做 实例属性对象调用的方法 叫做 实例方法每一个对象 都有自己独立的内存空间,保存各自不同的属性多个对象的方法,在内存中只有一份,在调用方法时,需要把对象的引用传递到方法内部
各个不同的属性,独一份的方法 在 Python 中,类是一个特殊的对象。
在程序运行时,类同样会被加载到内存在程序运行时,类对象在内存中只有一份,使用 一个类可以创建出很多个对象实例除了封装实例的属性和方法外,类对象还可以拥有自己的属性和方法——类属性、类方法,通过 类名. 的方式可以 访问类的属性 或者 调用类的方法
类的结构 4.2 类属性和实例属性类属性 就是 类对象中定义的属性通常用来记录与这个类相关的特征类属性不会用于记录具体对象的特征示例:定义一个 工具类,每件工具都有自己的 name:需求 —— 知道使用这个类,创建了多少个工具对象?
在 Python 中 属性的获取 存在一个 向上查找机制
因此,要访问类属性有两种方式:
语法如下 @classmethoddef 类方法名(cls): pass
示例
def show_tool_count(cls): """显示工具对象的总数""" print("工具对象的总数 %d" % cls.count)4.3.2 静态方法
语法如下 @staticmethoddef 静态方法名(): pass
示例:
探索:
需求
解决办法
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 赋值给任何一个变量。
4、eval() 函数十分强大 —— 将字符串 当成 有效的表达式 来求值 并 返回计算结果
__import__('os').system('ls')# 等价代码import osos.system("终端命令") |
微信公众号
手机版