python是一门解释型语言
控制台输出语句
print("hello python")
$ sudo apt install ipython 安装比较好用的python命令行工具
Python 的 IDE —— PyCharm
注释
# 这是第一个单行注释 """ 这是一个多行注释 在多行注释之间,可以写很多很多的内容…… """
-
特殊算数运算符
// 取整除 返回除法的整数部分(商) 9 // 2 输出结果 4 ** 幂 又称次方、乘方,2 ** 3 = 8 -
*
运算符还可以用于字符串,计算结果就是字符串重复指定次数的结果In [1]: "-" * 50 Out[1]: '----------------------------------------'
数字型变量 和 字符串 之间 不能进行其他计算
type(x) 查看 x 的变量类型
-
键盘输入
字符串变量 = input("提示信息:")
-
格式化字符
print("我的名字叫 %s,请多多关照!" % name) print("我的学号是 %06d" % student_no) # 000001 print("苹果单价 %.02f 元/斤,购买 %.02f 斤,需要支付 %.02f 元" % (price, weight, money)) print("数据比例是 %.02f%%" % (scale * 100))
-
if else
if 条件1: …… elif 条件2: …… else: ……
-
and or not
条件1 and 条件2 条件1 or 条件2 not 条件
-
定义函数的格式如下
def 函数名(): 函数封装的代码 ……
-
pyc文件
c是compiled的意思
浏览程序目录会发现一个 pycache 的目录
目录下会有类似 xxx.cpython-35.pyc 的文件,cpython-35 表示 Python 解释器的版本
这个 pyc 文件是由 Python 解释器将 模块的源码 转换为 字节码
Python 这样保存 字节码 是作为一种启动 速度的优化
-
Python
在解释源程序时是分成两个步骤的- 首先处理源代码,编译 生成一个二进制 字节码
- 再对 字节码 进行处理,才会生成 CPU 能够识别的 机器码
- 有了模块的字节码文件之后,下一次运行程序时,如果在 上次保存字节码之后 没有修改过源代码,Python 将会加载 .pyc 文件并跳过编译这个步骤
- 当
Python
重编译时,它会自动检查源文件和字节码文件的时间戳 - 如果你又修改了源代码,下次程序运行时,字节码将自动重新创建
-
在 Python 中,所有 非数字型变量 都支持以下特点:
- 都是一个 序列
sequence
,也可以理解为 容器 - 取值
[]
- 遍历
for in
- 计算长度、最大 / 最小值、比较、删除
- 链接
+
和 重复*
- 切片
- 都是一个 序列
-
列表 其他语言经常叫数组
name_list = ["zhangsan", "lisi", "wangwu"]
-
列表常用操作
序号 分类 关键字 / 函数 / 方法 说明 1 增加 列表.insert (索引,数据) 在指定位置插入数据 列表.append (数据) 在末尾追加数据 列表.extend (列表 2) 将列表 2 的数据追加到列表 2 修改 列表 [索引] = 数据 修改指定索引的数据 3 删除 del 列表 [索引] 删除指定索引的数据 列表.remove [数据] 删除第一个出现的指定数据 列表.pop 删除末尾数据 列表.pop (索引) 删除指定索引数据 列表.clear 清空列表 4 统计 len (列表) 列表长度 列表.count (数据) 数据在列表中出现的次数 5 排序 列表.sort () 升序排序 列表.sort (reverse=True) 降序排序 列表.reverse () 逆序、反转 【注】如果使用
del
关键字将变量从内存中删除,后续的代码就不能再使用这个变量了 -
Tuple
(元组)与列表类似,不同之处在于元组的 元素不能修改info_tuple = ("zhangsan", 18, 1.75) # 元组中 只包含一个元素 时,需要 在元素后面添加逗号 info_tuple = (50, ) # 数据在元祖中出现的次数 info_tuple.count(数据) # 数据第一次出现的索引 info_tuple.index(数据)
-
元组和列表之间的转换
list(元组) tuple(列表)
-
字典
字典[key] key不存在会报错 del 字典[key] key不存在会报错 字典.pop(key) key不存在会报错 字典.setdefault(key, value) key不存在添加key value,key存在不做操作 字典.clear 字典.items 所有(key,value)元组列表 字典.setdefault 字典.copy 字典.keys 字典.update(字典2) 字典2的数据合并到字典 字典.fromkeys 字典.pop 字典.values 字典.get 字典.popitem
-
字符串截取(列表和元组同理)
num_str = "0123456789" # 1. 截取从 2 ~ 5 位置 的字符串 print(num_str[2:6]) # 2. 截取从 2 ~ `末尾` 的字符串 print(num_str[2:]) # 3. 截取从 `开始` ~ 5 位置 的字符串 print(num_str[:6]) # 4. 截取完整的字符串 print(num_str[:]) # 5. 从开始位置,每隔一个字符截取字符串 print(num_str[::2]) # 6. 从索引 1 开始,每隔一个取一个 print(num_str[1::2]) # 倒序切片 # -1 表示倒数第一个字符 print(num_str[-1]) # 7. 截取从 2 ~ `末尾 - 1` 的字符串 print(num_str[2:-1]) # 8. 截取字符串末尾两个字符 print(num_str[-2:]) # 9. 字符串的逆序(面试题) print(num_str[::-1])
-
容器运算符
运算符 Python 表达式 结果 描述 支持的数据类型 + [1, 2] + [3, 4] [1, 2, 3, 4] 合并 字符串、列表、元组 * ["Hi!"] * 4 ['Hi!', 'Hi!', 'Hi!', 'Hi!'] 重复 字符串、列表、元组 in 3 in (1, 2, 3) True 元素是否存在 字符串、列表、元组、字典 not in 4 not in (1, 2, 3) True 元素是否不存在 字符串、列表、元组、字典 > >= == < <= (1, 2, 3) < (2, 2, 3) True 元素比较 字符串、列表、元组 -
for else语法对,真是很费解干什么用
for 变量 in 集合: 循环体代码 else: 没有通过 break 退出循环,循环结束后,会执行的代码
pass 是空语句,占位用
-
LINUX 上的 Shebang 符号 (#!)
#! 这个符号叫做 Shebang 或者 Sha-bang Shebang 通常在 Unix 系统脚本的中 第一行开头 使用 指明 执行这个脚本文件 的 解释程序 比如在一个.py文件的第一行加入#! /usr/bin/python3, 就可以直接在shell中敲入这个文件的路径,就会用python3解释运行
-
哈希
(hash)
-
Python
中内置有一个名字叫做hash(o)
的函数- 接收一个 不可变类型 的数据作为 参数
- 返回 结果是一个 整数
-
哈希
是一种 算法,其作用就是提取数据的 特征码(指纹)- 相同的内容 得到 相同的结果
- 不同的内容 得到 不同的结果
- 在
Python
中,设置字典的 键值对 时,会首先对key
进行hash
已决定如何在内存中保存字典的数据,以方便 后续 对字典的操作:增、删、改、查- 键值对的
key
必须是不可变类型数据 - 键值对的
value
可以是任意类型的数据
- 键值对的
-
函数不能直接修改
全局变量的引用
-
函数不能直接修改
全局变量的值
num = 10 def demo1(): # global 关键字,告诉 Python 解释器 num 是一个全局变量 global num num = 100 # 如果没有上面的global num 这里只会定义一个局部变量 print(num)
在 调用函数时,如果有 多个缺省参数,需要指定参数名,这样解释器才能够知道参数的对应关系!
```python
def print_info(name, title="", gender=True):
...
print_info("小明")
print_info("老王", title="班长")
print_info("小美", gender=False)
```
-
有时可能需要 一个函数 能够处理的参数 个数 是不确定的,这个时候,就可以使用 多值参数
python
中有 两种 多值参数:- 参数名前增加 一个
*
可以接收 元组 - 参数名前增加 两个
*
可以接收 字典
一般在给多值参数命名时,习惯使用以下两个名字
-
*args
—— 存放 元组 参数,前面有一个*
-
**kwargs
—— 存放 字典 参数,前面有两个*
args
是arguments
的缩写,有变量的含义kw
是keyword
的缩写,kwargs
可以记忆 键值对参数 - 参数名前增加 一个
def demo(num, *args, **kwargs):
print(num)
print(args)
print(kwargs)
demo(1, 2, 3, 4, 5, name="小明", age=18, gender=True)
""""
1
(2, 3, 4, 5)
{'name': '小明', 'age': 18, 'gender': True}
""""
-
元组和字典的拆包
在调用带有多值参数的函数时,如果希望:
- 将一个 元组变量,直接传递给
args
- 将一个 字典变量,直接传递给
kwargs
就可以使用 拆包,简化参数的传递,拆包 的方式是:
- 在 元组变量前,增加 一个
*
- 在 字典变量前,增加 两个
*
- 将一个 元组变量,直接传递给
demo(*tuple, **dic)
使用内置函数
dir
传入 标识符 / 数据,可以查看对象内的 所有属性及方法-
类的定义
class Cat: def __init__(self): print("这是一个初始化方法") # 定义用 Cat 类创建的猫对象都有一个 name 的属性 self.name = "Tom" def eat(self): print("%s 爱吃鱼" % self.name) # 使用类名()创建对象的时候,会自动调用初始化方法 __init__ tom = Cat() tom.eat()
在类封装的方法内部,
self
就表示 当前调用方法的对象自己 在调用方法时不用穿self这个参数-
内置方法和属性
序号 方法名 类型 作用 01 __del__
方法 对象被从内存中销毁前,会被 自动 调用 02 __str__
方法 返回对象的描述信息, print
函数输出使用 -
身份运算符
运算符 描述 实例 is is 是判断两个标识符是不是引用同一个对象 x is y,类似 id (x) == id (y) is not is not 是判断两个标识符是不是引用不同对象 x is not y,类似 id (a) != id (b) 在
Python
中针对None
比较时,建议使用is
判断 在 定义属性或方法时,在 属性名或者方法名前 增加 两个下划线,定义的就是 私有 属性或方法
Python
中,并没有 真正意义 的 私有 。在给 属性、方法 命名时,实际是对 名称 做了一些特殊处理,使得外界无法访问到-
使用 类名 () 创建对象时,
Python
的解释器 首先 会 调用__new__
方法为对象 分配空间。重写 new 方法 一定要 return super().new(cls)# 单例模式 class MusicPlayer(object): # 定义类属性记录单例对象引用 instance = None def __new__(cls, *args, **kwargs): # 1. 判断类属性是否已经被赋值 if cls.instance is None: cls.instance = super().__new__(cls) # 2. 返回类属性的单例引用 return cls.instance
如果想让
__init__
方法也执行一次需要添加个类变量init_flag-
实例方法、类方法和静态方法
- 实例方法第一个参数是self
- 类方法使用@classmethod修饰符
- 静态方法使用装饰器
@staticmethod
。 既可以使用类也可以使用实例来调用静态方法
继承
class Child(Parent):
super().父类方法调用父类方法
多继承继承``class Child(Father, Mother):
在
Python
中 属性的获取 存在一个 向上查找机制。首先在对象内部属性中查找,如果没有再查找类属性模块是 Python 程序架构的一个核心概念。每一个以扩展名
py
结尾的Python
源代码文件都是一个 模块-
模块导入
import 模块名1, 模块名2 import 模块名1 import 模块名2 import 模块名1 as 模块别名 from 模块名1 import 工具名(全局变量、函数、类) from 模块名1 import * #从模块导入所有工具。这种方式不推荐,因为函数重名并没有任何的提示,出现问题不好排查
如果 两个模块,存在 同名的函数,那么 后导入模块的函数,会 覆盖掉先导入的函数
Python
中每一个模块都有一个内置属性__file__
可以 查看模块 的 完整路径-
__name__
属性可以做到,测试模块的代码 只在测试情况下被运行,而在 被导入时不会被执行!便于单文件测试- 如果 是被其他文件导入的,
__name__
就是 模块名 - 如果 是当前执行的程序
__name__
是 main
# 导入模块 # 定义全局变量 # 定义类 # 定义函数 # 在代码的最下方 def main(): # ... pass # 根据 __name__ 判断是否执行下方代码。 if __name__ == "__main__": main()
- 如果 是被其他文件导入的,
-
可以在目录下创建
__init__.py
。import 包名,就可以导入里边所有模块# 从 当前目录 导入 模块列表 from . import send_message from . import receive_message
-
如果希望自己开发的模块,分享 给其他人,可以按照以下步骤操作
- 制作发布压缩包步骤
- 创建 setup.py
from distutils.core import setup setup(name="hm_message", # 包名 version="1.0", # 版本 description="itheima's 发送和接收消息模块", # 描述信息 long_description="完整的发送和接收消息模块", # 完整描述信息 author="itheima", # 作者 author_email="itheima@itheima.com", # 作者邮箱 url="www.itheima.com", # 主页 py_modules=["hm_message.send_message", "hm_message.receive_message"])
有关字典参数的详细信息,可以参阅官方网站:
https://docs.python.org/2/distutils/apiref.html
- 构建模块
$ python3 setup.py build
- 生成发布压缩包
$ python3 setup.py sdist
注意:要制作哪个版本的模块,就使用哪个版本的解释器执行!
* 安装模块
```bash
$ tar -zxvf hm_message-1.0.tar.gz
$ sudo python3 setup.py install
```
* 卸载模块
直接从安装目录下,把安装模块的 **目录** 删除就可以
```bash
$ cd /usr/local/lib/python3.5/dist-packages/
$ sudo rm -r hm_message*
```
-
pip 安装/卸载第三方模块
# 将模块安装到 Python 2.x 环境 $ sudo pip install pygame $ sudo pip uninstall pygame # 将模块安装到 Python 3.x 环境 $ sudo pip3 install pygame $ sudo pip3 uninstall pygame
-
捕获异常
try: num = int(input("请输入整数:")) result = 8 / num print(result) except ValueError: print("请输入正确的整数") except ZeroDivisionError: print("除 0 错误") except Exception as result: print("未知错误 %s" % result) else: # 没有异常才会执行的代码 pass finally: # 无论是否有异常,都会执行的代码 print("无论是否有异常,都会执行的代码")
-
异常的传递 —— 当 函数 / 方法 执行 出现异常,会 将异常传递 给 函数 / 方法 的 调用一方
如果 传递到主程序,仍然 没有异常处理,程序才会被终止
-
手动抛出异常
ex = Exception("密码长度不够") raise ex
eval()
—— 将字符串 当成 有效的表达式 来求值 并 返回计算结果在开发时千万不要使用
eval
直接转换用户input
的结果-
使用import导入Python模块的时候,默认调用的是
__import__()
函数。直接使用该函数的情况很少见,一般用于动态加载模块。__import__(name, globals, locals, fromlist, level)
只有name
是必选参数,其他都是可选参数,一般情况下直接使用name
参数即可。 -
vi
是Visual interface
的简称,是Linux
中 最经典 的文本编辑器vi
的核心设计思想 —— 让程序员的手指始终保持在键盘的核心区域,就能完成所有的编辑操作 -
vim = vi improved
vim
是从vi
发展出来的一个文本编辑器,支持 代码补全、编译 及 错误跳转 等方便编程的功能特别丰富,在程序员中被广泛使用 -
如果vi是软连接,通过命令 ls -l 最后一列就是软连接的原始地址
$ which vi $ ls -l /usr/bin/vi
-
打开文件并定位到行
$ vi 文件名 +行数 # 如果只带上 + 而不指定行号,会直接定位到文件末尾
-
shell 俗称壳,c 语言编写的命令解析器程序,是用户使用 linux 的桥梁。Linux/Unix 提供了很多种 Shell。常用的 shell 有这么几种,sh、bash、csh 等。可以通过以下命令,查看系统有几种 shell:
$ cat /etc/shells