python设计目标
- 一门简单直观的语言,与主要竞争者一样强大
- 开源,任何人都可以做贡献
- 代码像纯英语那样好理解
- 适用于短期开发的日常任务
Hello World
1 | print("hello world") |
变量
1 | qq_number = '10086' |
函数
1 | #print 输出日志 |
练习
1 | #租房 |
格式化字符
- %s 字符串
- %d 整数 %06d表示输出的整数显示位数,不足的地方用0补全
- %f 浮点数 %.02f代表小数点后只显示两位
- %% 输出%
1 | name = "Alice" |
比较运算符
| 运算符 | 描述 | 示例 | 结果 |
|---|---|---|---|
== |
等于 | 5 == 3 |
False |
!= |
不等于 | 5 != 3 |
True |
> |
大于 | 5 > 3 |
True |
< |
小于 | 5 < 3 |
False |
>= |
大于等于 | 5 >= 3 |
True |
<= |
小于等于 | 5 <= 3 |
False |
if语句
1 | age = 17 |
石头剪刀布 rendom模块
1 | user = int(input("请输入你要出的内容: 石头1 剪刀2 布3: ")) |
赋值运算符
| 运算符 | 描述 | 示例 |
|---|---|---|
| = | 简单赋值运算符 | c = a + b |
| += | 加法赋值运算符 | 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 |
while 循环
1 | sayhi = "Hello world" |
转义字符
| 转义字符 | 名称 | 说明 | 示例 |
|---|---|---|---|
\n |
换行 | 将光标移动到下一行 | print("Hello\nWorld") |
\t |
制表符 | 插入一个水平制表位(Tab) | print("A\tB") |
\\ |
反斜杠 | 表示一个反斜杠字符 | print("\\") |
\' |
单引号 | 在单引号字符串中表示单引号 | print('I\'m OK') |
\" |
双引号 | 在双引号字符串中表示双引号 | print("He said \"Hi\"") |
\r |
回车 | 光标移到行首(覆盖前面内容) | print("Hello\rHi") |
\b |
退格 | 删除前一个字符 | print("AB\bC") |
\f |
换页符 | 很少使用,部分环境有效 | print("Hello\fWorld") |
\v |
垂直制表符 | 很少使用 | print("A\vB") |
\0 |
空字符 | 表示字符串结尾(C风格) | print("\0") |
1 | row = 1 |
函数
1 | def int_test(): #可以在另一个文件import |
模块
- 每一个py结尾的文件都是一个模块
- 在模块中定义的全局变量、函数都是模块能够提供给外界直接使用的工具
pyc文件 会把导入的模块编译成字节码作为启动速度优化
…
列表
1 | arr = ['Alice', 'Bob', 'Steve'] |
元组
- Tuple 元组的元素不能修改
- 元组表示多个元素组成的序列
- 用于存储一串信息,数据之间用
,分割 - 元组用()定义
- 元组的索引从0开始
- 通常存储不同类型的数据
1 | info_tuple = ("Steve", 1, 2, "Steve") |
字典
- dictionary 是python除列表外最灵活的数据类型
- 使用键值对存储数据
- 键
key是索引 - 值
value是数据 - 键和值直接使用
:分割 - 键必须是唯一的
- 值可以取任何数据类型,键只能使用字符串、数字、元组
- 键
1 | test = {"name": "Steve", |
字符串
1 | s = "Hello world" |
公共方法
内置函数
- len 计算容器中元素个数
- del 删除变量 del有两种方式
- max 返回容器中元素最大值 如果是字典,只针对Key比较
- min 返回容器中元素最小值 如果是字典,只针对Key比较
切片
- 字典不支持切片
运算符
- 字典不支持 + * 以及比较运算符
1 |
|
名片管理
…
变量的引用
- 使用id()函数可以查看变量中保存数据所在的内存地址
1 | a = 1 |
可变和不可变类型
不可变类型
- 数字类型
int,bool,float,complex,long(2.x) - 字符串
str - 元组
tuple
- 数字类型
可变类型
- 使用方法修改数据不会影响列表和字典在内存中的地址. 一旦使用赋值语句 内存地址就会变化.
- 列表
list - 字典
dict- 字典的key只能使用不可变类型
哈希(hash)
- 哈希是一种算法
- python中
hash(0)只接收不可变类型 - Python 的 hash 是把一个对象转换成固定长度的整数值,用于快速比较和查找(主要给 dict、set 用)
局部变量和全局变量
- 局部变量是在函数内部定义的变量,只能在函数内部使用
- 局部变量 不同的函数可以定义相同名字的局部变量 彼此之间不会产生影响
- 全局变量是在函数外部定义的变量,所有函数内部都可以使用这个变量
- 全局变量 函数内部不能直接修改全局变量,如果使用赋值语句会在函数内部定义一个局部变量
- 如果在函数中需要修改全局变量可以使用
global关键字 => global var - 开发时应该把全局变量放在所有函数上方 这样能保证函数都可以访问全局变量
- 全局变量命名建议添加
g_或gl_前缀
局部变量的生命周期
- 所谓生命周期就是变量从被创建到被系统回收的过程
- 局部变量在生命周期内,可以用来存储函数内部临时用到的数据
1 |
|
函数参数和返回值的作用
1 | # 利用元组返回多个值 |
函数的参数 进阶
可变和不可变参数
1 | # 在函数内部,针对参数使用赋值语句 不会修改到外部实参变量 |
缺省参数
- 定义函数时,可以给某个参数指定一个默认值,具有默认值的参数就叫做缺省参数
- 指定缺省参数的默认值时应该使用最常见的值作为默认值
- 如果一个参数的值不能确定 则不应该设置默认值
- 带有默认值的缺省参数必须在参数列表末尾
1 | gl_list = [1, 3, 4, 2] |
多值参数
- 一个函数能处理的参数个数是不确定的 这个时候可以使用多值参数
- 参数名前加一个
*可以接收元组, 参数名前**可以接收字典
1 | def demo(num, *nums, **person): |
递归
- 一个函数内部调用自己
- 函数内部代码相同,只针对参数不同 处理的结果不同
- 当参数满足一个条件 函数不再执行 这称为递归的出口 如果没有出口会出现死循环
1 | def sum_numbers(num): |
面向对象
Object Oriented Programming–OOP- 面向过程和面向对象是两种不同的编程方式
- 根据职责在一个对象中封装多个方法
- 是专门应对复杂的开发项目,提供的固定套路
- 面向对象开放前先进行需求分析
类(class)
- 类 是对一群具有相同特征或者行为的事物的一个统称,是抽象的,不能直接使用
- 特征被称为属性, 行为被称为方法
- 类是一个模板 是负责创建对象的
- 类只有一个 对象可以有很多个
dir 内置函数
- dir可以查看python提供的内置方法/属性
1 | def demo(): |
1 | class Cat: |
封装对象
1 | class Gun: |
身份运算符
- 用于笔记两个对象的内存地址是否一致 是否是对同一个对象的引用
- 针对
None建议使用is判断 is是判断两个标识符是不是引用同一个对象,x is y, id(x) == id(y)is not是判断两个表示是不是引用不同对象,x is not y, id(x) != id(y)is是用于判断两个变量引用的对象是不是同一个,==是判断引用变量的值是不是相等
私有属性和私有方法
1 | class Women: |
单继承
- 继承可以实现代码的重用,相同的代码不需要重复编写
- 概念:子类拥有父类的所有方法和属性
1 | class Animal: |
方法重写
- 如果父类的方法实现和子类的方法实现完全不同
- 可以使用覆盖的方式,在子类中重新编写父类的方法实现 =>在子类中定义一个和父类同名的方法
- 重写后只会调用子类重写的方法
1 | class Animal: |
父类的私有属性和方法
- 子类对象不能在自己的方法内部直接访问父类的私有属性和私有方法
- 可以通过父类公有方法简介访问私有属性和私有方法
1 | class A: |
多继承
- 多继承可以让子类对象同时具有多个父类的属性和方法
- 如果父类之间存在同名属性或方法应该避免使用多继承
1 | class A: |
多态
- 不同的子类对象调用相同父类方法 产生不同的执行结果
- 多态可以增加代码灵活度
- 以继承和重写父类方法为前提
- 是调用方法技巧 不会影响类的内部设计
1 | class Dog(object): |
类属性和实例属性
- 类属性就是给类对象中定义的属性
- 通常用来记录与这个类相关的特征
- 类属性不会用于记录具体对象的特征
- 访问类属性方法: 1.类名.类属性
- 访问类属性方法: 2.对象.类属性 (不推荐)使用对象,类属性 = 值 的赋值语句 只会给对象添加一个属性,不会影响类属性的值
1 | class Tools(object): |
类方法和静态方法
- 类属性就是针对类对象定义的属性
- 类方法就是针对类对象定义的方法
1 | #修饰器标识 告诉解释器 这是类方法 |
单例
设计模式
使用设计模式是为了可重用代码,让代码更容易被他人理解,保证代码可靠性
单例设计模式
让类创建的对象,在系统中只有唯一的一个实例
每一次执行类名()返回的对象,内存地址是相同的
1 | class MusicPlayer(object): |
异常
1 | try: |
模块
- 如果模块名字太长可以用
as给模块起别名 - 如果在不同的模块中导入同名的工具 会执行下面的 后导入模块的函数会覆盖先导入的
- 可以使用as关键字避免重名问题
- import文件时 文件中没有任何缩进的代码 都会被执行一遍
- 测试模块时 可以用
-__name__
1 | if __name__ == "__main__": |
1 | import test as model |
包 package
- 是一个包含多个模块的特殊目录
- 目录下有一个特殊文件
__init__.py
1 | from . import xxx |
发布模块
1 | #distutils.core模块已弃用 |
文件的基本操作
Python操作文件的方法
open打开文件 并返回文件操作对象–默认以只读方式打开文件read将文件内容读取到内存writw将指定内容写入文件close关闭文件
1 | file = open("README") |
执行文件和目录管理操作
1 | import os |
eval 函数
1 | #不要使用eval直接input结果 |
…
IP
1 | from random import randint |