Python
变量
变量命名规则
- 变量名必须以字母或下划线字符开头
- 变量名称不能以数字开头
- 变量名只能包含字母数字字符和下划线(A-z、0-9 和 _)
- 变量名称区分大小写(age、Age 和 AGE 是三个不同的变量)
变量赋值
切片法:x, y, z = "Orange", "Banana", "Cherry"
多个变量名同时赋值:x = y = z = "Orange"
变量输出
print()函数
如果文本和变量同时输出,需要两者之间加 “ + ” 或 “ ,”
全局变量
函数外定义的变量为全局变量
Global 关键字,可以在函数中定义全局变量
数据类型
- 文本类型:str
- 数值类型:int , float, complex
- 序列类型:list, tuple, range
- 映射类型:dict
- 集合类型:set, frozenset
- 布尔类型:bool
- 二进制类型:bytes, bytearray, memoryview
数字
整数
int:正数 负数 没有小数 长度不限
浮点数
float:包含小数的正数和负数
复数
complex:用 j 做虚数来编写
随机数
Python 没有 random()函数来创建随机数,但 Python 有一个名为 random
的内置模块,可用于生成随机数:
导入 random 模块,并显示 1 到 9 之间的随机数:
import random print(random.randrange(1,10))
字符串
字符串的驻留机制
定义
相同内容的字符串不会出现不同的地址,只会同时指向同一个空间
驻留机制的几种情况
- 字符串的长度为 0 和 1 时
- 复合标识符的字符串
- 字符串只在编译时进行驻留,而非运行时
- 【-5,256】之间的整数数字
- pycharm 对字符串进行了优化,都驻留
字符串驻留机制的优缺点
- 当需要值相同的字符串时,可以直接从字符串池里拿来使用,避免频繁的创建和销毁,提升效率和节约内存,因此拼接字符串和修改字符串是会比较影响性能的
- 在需要进行字符串拼接时,建议使用 str 类型的 join 方法,而非 + ,因为 join()方法是先计算虎所有字符中的长度,然后再拷贝,只 new 一次对象,效率要比 ” + “ 效率高
字符串是数组
裁切
可以采用裁切语法返回一定范围的字符
b = "Hello, World!" print(b[2:5]) b = "Hello, World!" print(b[-5:-2])
获取字符串的长度
len() 函数返回字符串的长度:
a = "Hello, World!" print(len(a))
字符串格式
- 正如在 Python 变量一章中所学到的,我们不能像这样组合字符串和数字:
age = 63 txt = "My name is Bill, I am " + age print(txt)
- 但是我们可以使用
format()
方法组合字符串和数字!
format()
方法接受传递的参数,格式化它们,并将它们放在占位符{}
所在的字符串中:使用
format()
方法将数字插入字符串:age = 63 txt = "My name is Bill, and I am {}" print(txt.format(age))
format()
方法接受不限数量的参数,并放在各自的占位符中:
quantity = 3 itemno = 567 price = 49.95 myorder = "I want {} pieces of item {} for {} dollars." print(myorder.format(quantity, itemno, price))
- 您可以使用索引号
{0}
来确保参数被放在正确的占位符中:
quantity = 3 itemno = 567 price = 49.95 myorder = "I want to pay {2} dollars for {0} pieces of item {1}." print(myorder.format(quantity, itemno, price))
字符串方法
Python 有一组可以在字符串上使用的内建方法。
注释:所有字符串方法都返回新值。它们不会更改原始字符串。
方法 | 描述 |
---|---|
capitalize() | 把首字符转换为大写。 |
casefold() | 把字符串转换为小写。 |
center() | 返回居中的字符串。 |
count() | 返回指定值在字符串中出现的次数。 |
encode() | 返回字符串的编码版本。 |
endswith() | 如果字符串以指定值结尾,则返回 true。 |
expandtabs() | 设置字符串的 tab 尺寸。 |
find() | 在字符串中搜索指定的值并返回它被找到的位置。 |
format() | 格式化字符串中的指定值。 |
format_map() | 格式化字符串中的指定值。 |
index() | 在字符串中搜索指定的值并返回它被找到的位置。 |
isalnum() | 如果字符串中的所有字符都是字母数字,则返回 True。 |
isalpha() | 如果字符串中的所有字符都在字母表中,则返回 True。 |
isdecimal() | 如果字符串中的所有字符都是小数,则返回 True。 |
isdigit() | 如果字符串中的所有字符都是数字,则返回 True。 |
isidentifier() | 如果字符串是标识符,则返回 True。 |
islower() | 如果字符串中的所有字符都是小写,则返回 True。 |
isnumeric() | 如果字符串中的所有字符都是数,则返回 True。 |
isprintable() | 如果字符串中的所有字符都是可打印的,则返回 True。 |
isspace() | 如果字符串中的所有字符都是空白字符,则返回 True。 |
istitle() | 如果字符串遵循标题规则,则返回 True。 |
isupper() | 如果字符串中的所有字符都是大写,则返回 True。 |
join() | 把可迭代对象的元素连接到字符串的末尾。 |
ljust() | 返回字符串的左对齐版本。 |
lower() | 把字符串转换为小写。 |
lstrip() | 返回字符串的左修剪版本。 |
maketrans() | 返回在转换中使用的转换表。 |
partition() | 返回元组,其中的字符串被分为三部分。 |
replace() | 返回字符串,其中指定的值被替换为指定的值。 |
rfind() | 在字符串中搜索指定的值,并返回它被找到的最后位置。 |
rindex() | 在字符串中搜索指定的值,并返回它被找到的最后位置。 |
rjust() | 返回字符串的右对齐版本。 |
rpartition() | 返回元组,其中字符串分为三部分。 |
rsplit() | 在指定的分隔符处拆分字符串,并返回列表。 |
rstrip() | 返回字符串的右边修剪版本。 |
split() | 在指定的分隔符处拆分字符串,并返回列表。 |
splitlines() | 在换行符处拆分字符串并返回列表。 |
startswith() | 如果以指定值开头的字符串,则返回 true。 |
strip() | 返回字符串的剪裁版本。 |
swapcase() | 切换大小写,小写成为大写,反之亦然。 |
title() | 把每个单词的首字符转换为大写。 |
translate() | 返回被转换的字符串。 |
upper() | 把字符串转换为大写。 |
zfill() | 在字符串的开头填充指定数量的 0 值。 |
注释:所有字符串方法都返回新值。它们不会更改原始字符串。
函数
函数的创建和调用
什么是函数
- 函数就是执行特定任务和完成特定功能的一段代码
为什么需要函数
- 实现代码复用
- 隐藏实现细节
- 提高可维护性
- 提高可读性便于调试
函数的创建
def my_function(): print("Hello from a function") my_function()
函数的调用
默认参数值
如果我们调用了不带参数的函数,则使用默认值:
def my_function(country = "China"): print("I am from " + country) my_function("Sweden") my_function("India") my_function() my_function("Brazil")
任意参数
如果您不知道将传递给您的函数多少个参数,请在函数定义的参数名称前添加 *。
这样,函数将接收一个参数元组,并可以相应地访问各项:
def my_function(*kids): print("The youngest child is " + kids[2]) my_function("Phoebe", "Jennifer", "Rory")
匿名函数 lambda
lambda 函数可接受任意数量的参数,但只能有一个表达式
为什么使用 lambda 函数
当您把 lambda 用作另一个函数内的匿名函数时,会更好地展现 lambda 的强大能力。
假设您有一个带一个参数的函数定义,并且该参数将乘以未知数字:
def myfunc(n): return lambda a : a * n
使用该函数定义来创建一个总是使所发送数字加倍的函数:
def myfunc(n): return lambda a : a * n mydoubler = myfunc(2) print(mydoubler(11))
BUG
代码异常处理机制
-
try:
-
except 异常类型1:
-
except 异常类型2:
-
···
-
expect BaseException as e:
else:代码与 except 二者只执行其一,可以防止代码出错被处理后,继续执行源代码
- finally:无论如何都会执行的代码
代码常见的异常类型
序号 | 异常类型 | 描述 |
---|---|---|
1 | ZeroDivisionError | 除(或者取模)零(所有数据类型) |
2 | IndexError | 序列中没有此索引 |
3 | KeyError | 映射中没有这个键 |
4 | NameError | 未声明 / 初始化对象(没有属性) |
5 | SyntaxError | Python 语法错误 |
6 | ValueError | 传入无效参数 |
traceback模块
导入该模块后,在 except 中,traceback.print_exc() , 系统就会报出发生的错误
类与对象
类 与 对象 的创建
print('创建类------------------------------------------------------') class Student: # Student 为类的名称(类名)由一个或多个单词组成,单词首字母大写 native_place = 'JiLin' # 直接写在类里的变量,成为类属性 # 初始化方法 def __init__(self, name, age): # name, age 为实例属性 self.name = name # self.name 成为实体属性 self.age = age # 实例方法 def eat(self): print(self, '学生在吃饭') # 静态方法 @staticmethod def method(): print('我使用了 @staticmethod 进行修饰,所以我是静态方法') # 类方法 @classmethod def cm(cls): print('我使用了 @classmethod 进行修饰,所以我是类方法') print('创建 Student 的对象---------------------------------') stu1 = Student('张三', 30) stu1.eat() stu1.method() Student.eat(stu1)
类方法和静态方法的使用方式
都需要类名直接调用的
Student.method() Student.cm()
面向对象的三大特征
封装:提高程序安全性
- 将数据(属性)和行为(方法)包装到类对象中。在方法内部对属性进行操作,在类对象的外部调用方法。这样,无需关心方法内部的具体实现细节,从而隔离了复杂度
- 在 Python 中没有专门的修饰符用于属性的私有,如果该属性不希望在类对象外部被访问,前边使用两个 “_”
继承:提高代码的复用性
如果一个类没有继承任何类,则默认继承 object,所以所有类都是父类,语法格式都相同
Python 支持多继承
定义子类时,必须在其构造函数中调用父类的构造函数
如果子类中与父类有相同名称的函数,子类会对父辈函数进行覆盖
super()函数会让子类对父类进行全属性和全方法的继承
class Student(Person): def __init__(self, fname, lname): super().__init__(fname, lname)
类方法重写:可以重新定义父类中的函数
# 实例方法 def eat(self): print(self.name, '在吃饭') # 重写前后---------------------------------------------- def eat(self): super().eat() print(self.name, '干饭!')
object 类 常用继承
__str__()
,以此返回用户描述def __str__(self): return '我是{0}, 今年{1}岁'.format(self.name, self.age)
多态:提高程序的可拓展性和可维护性
文件
文件处理
在 Python 中使用文件的关键函数是 open()
函数。
open()
函数有两个参数:文件名和模式。
有四种打开文件的不同方法(模式):
"r"
- 读取 - 默认值。打开文件进行读取,如果文件不存在则报错。"a"
- 追加 - 打开供追加的文件,如果不存在则创建该文件。"w"
- 写入 - 打开文件进行写入,如果文件不存在则创建该文件。"x"
- 创建 - 创建指定的文件,如果文件存在则返回错误。
此外,您可以指定文件是应该作为二进制还是文本模式进行处理。
"t"
- 文本 - 默认值。文本模式。"b"
- 二进制 - 二进制模式(例如图像)。
语法
此外,您可以指定文件是应该作为二进制还是文本模式进行处理:
f = open("demofile.txt")
以上代码等同于:
f = open("demofile.txt", "rt")
因为 "r"
(读取)和 "t"
(文本)是默认值,所以不需要指定它们。
注释:请确保文件存在,否则您将收到错误消息。
文件方法
方法 | 描述 |
---|---|
close() | 关闭文件。 |
detach() | 从缓冲区返回分离的原始流(raw stream)。 |
fileno() | 从操作系统的角度返回表示流的数字。 |
flush() | 刷新内部缓冲区。 |
isatty() | 返回文件流是否是交互式的。 |
read() | 返回文件内容。 |
readable() | 返回是否能够读取文件流。 |
readline() | 返回文件中的一行。 |
readlines() | 返回文件中的行列表。 |
seek() | 更改文件位置。 |
seekable() | 返回文件是否允许我们更改文件位置。 |
tell() | 返回当前的文件位置。 |
truncate() | 把文件调整为指定的大小。 |
writeable() | 返回是否能够写入文件。 |
write() | 把指定的字符串写入文件。 |
writelines() | 把字符串列表写入文件。 |
with语句
- with 语句可以自动管理上下文资源,不论什么原因跳出 with 块,都能确保文件正确的关闭,以此来达到释放资源的目的
# 文件练习 with open('D:/test.txt', 'r') as src_file: print(src_file.read()) pass
os 模块的常用函数
- os 模块是 Python 内置的与操作系统功能和文件系统相关的模块,该模块中的语句的执行结果通常与操作系统有关,在不同的操作系统上运行,得到的结果可能不一样。
- os 模块与 os.path 模块用于对目录或文件进行操作
关于python写项目
if name == '__main':
这是python模块确保不被运行的标志,Python属于脚本语言,从运行开始逐行运行,当这个.py文件被引用的时候,我们希望有些代码不被运行,所以写了这个main 确保被引用的时候不会全部运行
.pyc文件的出现和作用
-
先大概了解一下python基本运行机制。Python程序运行时不需要编译成二进制代码,而直接从源码运行程序,简单来说是,Python解释器将源码转换为字节码,然后再由解释器来执行这些字节码。
解释器的具体工作:
1、完成模块的加载和链接;
2、将源代码编译为PyCodeObject对象(即字节码),写入内存中,供CPU读取;
3、从内存中读取并执行,结束后将PyCodeObject写回硬盘当中,也就是复制到.pyc或.pyo文件中,以保存当前目录下所有脚本的字节码文件。