前言
这篇文章内容和结构还有所欠缺,在后续会持续抽空更新~
文章目录
一、头注释是什么?
头注释像是运动或者游戏里的规则,它会把这个规则告诉解释器(帮助执行Python脚本的),解释器根据头注释里的特定的规则去执行我们的python脚本。如果脚本里面有不符合规则的地方,解释器就会报错。
卸载python脚本第一行的用#号开头表示的信息就是头注释。
# coding:utf-8
头注释不是必要的,但是在国内编程的时候要注意使用。
头注释的作用
头注释是被系统或解释器所调用(例如:告诉python解释器在哪?脚本编码格式是哪个?)
头注释的结构
# coding:utf-8
#是注释符号
coding:utf-8 是注释内容,是脚本执行的特殊规则,符合我们脚本业务的规则
# coding:utf-8
#定义coding则告诉系统脚本是何编码格式
#!/usr/bin/env
#定义!/,会去找指定路径下的python解释器,但是现在安装完之后都会知道解释器在哪,所以现在这个目前很少使用
二、python导入位置
1.导入是什么
- 导入是将python的一些功能函数放到当前的脚本中使用
- 不导入的功能无法直接在当前脚本使用(除了python自带的内置函数)
- 将整个模块(somemodule)导入,格式为: import somemodule
- 从某个模块中导入某个函数,格式为: from somemodule import somefunction
- 从某个模块中导入多个函数,格式为: from somemodule import firstfunc, secondfunc, thirdfunc
将某个模块中的全部函数导入,格式为: from
somemodule import *
2.顺序
自上而下,逐行执行
- 头注释
- 导入
- 业务区域
三、内置函数
1.print
printf(object,end = ‘’)
object打印信息,多信息用逗号隔开;end为结尾符,默认为在打印完后的信息后空一行,这里加上后就不会换行了
print('名字是 %s,生日是 %s'% (name, birthday))
这里可以把变量name,birthday分别按顺序赋值给%s
四、python注释
- Python中单行注释以 # 开头
- 多行注释用三个单引号 ‘’’ 或者三个双引号 “”" 将注释括起来
# 这是一个单行注释
print("Hello, World!")
'''
这是多行注释,用三个单引号
这是多行注释,用三个单引号
'''
"""
这是多行注释,用三个双引号
这是多行注释,用三个双引号
"""
五、python基础知识
关键字
- python内部自带的用于处理业务逻辑的特殊单词
- 变量名绝不能使用关键字来命名
关键字与变量名的区别
变量名用于给变量赋值使用,而关键字用于业务逻辑处理
关键字的分类
- 强关键字(完全不能定义成变量名)
- 弱关键字(可以定义成变量名,但是会有影响它的功能)
行与缩进
python最具特色的就是使用缩进来表示代码块,不需要使用大括号 {}
多行语句
Python 通常是一行写完一条语句,但如果语句很长,我们可以使用反斜杠 \ 来实现多行语句.
在 [], {}, 或 () 中的多行语句,不需要使用反斜杠 \
同一行显示多条语句
Python 可以在同一行中使用多条语句,语句之间使用分号 ; 分割
代码组
缩进相同的一组语句构成一个代码块,我们称之代码组。
像if、while、def和class这样的复合语句,首行以关键字开始,以冒号( : )结束,该行之后的一行或多行代码构成代码组。
我们将首行及后面的代码组称为一个子句(clause)。
数据类型
- 数字类型(整型int、浮点型float、内置函数type)
- 字符串类型(字符串不可改变,内置函数id(返回变量的内存地址),内置函数len(返回字符串的长度,无法返回数字类型的长度),内置成员运算符In,内置函数max,内置函数min,字符串的叠加)
- 布尔类型
- 空类型(固定值:None,空类型属于False的范畴内,如果不确定类型就可以使用空类型)
- 列表类型(列表就是队列,它是各种数据类型的集合,也是一种数据结构,列表是一种有序,且内容可重复的集合类型,list代表列表,列表中的元素存在于一个**[]**中,在python中列表是一个无限制长度的数据结构;max和min使用时列表里的元素的数据类型得统一)
- 元组类型(元组可以存储多种数据结构的队列,元组是一个有序、元素可以重复的集合。tuple,元组中的元素在**()**小括号内;举例:name = (“xiaoming”,))后面必须要跟一个逗号)
列表和元组的区别:a.元组比列表占用资源更小
b.列表是可变的,元组是不可变的
字符串、整型、浮点型、布尔型,None类型,元组类型,列表类型、混合的元组 - 字典类型(字典由多个键key及其对应的值value所组成的一种数据类型;在python中,dict用来代表字典,并且可以创建一个字典,在python中,通过**{}**将一个个key和value存入字典中,举例{key1: value1, key2: value2};key支持字符串、数字、和元组,但是列表不支持,value支持python的数据类型)
- 集合类型(集合可以用{}或者set()函数创建集合,创建一个空集合必须使用set()而不是{},因为{}是用来创建一个空字典)
列表元素是元组、元组的元素类型是列表都是不可以被修改了。
赋值运算符
字符串与数字的乘法
- 字符串无法与字符串做乘法
- 字符串只可以和数字做乘法
- 列表和元组也可以和数字做乘法,但是返回的都是新的列表和元组
- 字典类型不支持乘法
比较运算符:
身份运算符是比较a、b内存编号是否一样。而且<>被弃用了在Python3之后。
在python解释器里,0~255是提前被分配好内存了,所以如果定义超过255的数字,就会分配不同的内存空间。在脚本里值相同,下一次值被赋给另外一个变量,但是也是引用那个数值的内存地址。
python中的对象
定义:
- python中一切都是对象。
对象像是身份的概念,人类就是变量,高级动物是人类的身份 - 每个对象都有自己的属性与方法
- 对象里的特点就是它的属性,它的功能就是它的方法
字符串的capitalize函数
- 功能:将字符串的首字母大写,其他字母小写
- 用法:newstr = string.capitalize()
- 参数:函数括弧内什么都不用填写
- 注意事项:只对第一个字母有效;只对字母有效;首字母大写了,则无效。
- lower() 方法只对ASCII编码,也就是‘A-Z’有效,对于其他语言(非汉语或英文)中把大写转换为小写的情况只能用 casefold() 方法。
字符串的casefold和lower函数
- 功能:将字符串小写
- 用法:newstr = string.casefold()
newstr = string.lower() - 注意事项:只对字符串中的字母有效;已经小写了,则无效。
字符串的upper函数
- 功能:将字符串大写
- 用法:newstr = string.upper()
- 注意事项:只对字符串中的字母有效;已经大写了,则无效。
字符串的swapcase函数
- 功能:用于对字符串的大小写字母进行转换
- 用法:newstr = string.swapcase()
- 注意事项:只对字符串中的字母有效
。
字符串的zfill函数
- 功能:为字符串定义长度,如不满足,缺少的部分用0填补
- 用法:newstr =string.zfill(width),width为新字符串希望的长度
- 注意事项:与字符串中的字符无关;如果定义长度小于当前字符串长度,则不会发生变化。
字符串的zfill函数
- 功能:为字符串定义长度,如不满足,缺少的部分用0填补
- 用法:newstr = string.zfill(width),width为新字符串希望的长度
注意事项:原字符串右对齐
字符串的count函数
- 功能:用于统计字符串里某个字符或子字符串出现的次数。可选参数为在字符串搜索的开始与结束位置。
- 用法:str.count(sub, start= 0,end=len(string))
sub – 搜索的子字符串
start – 字符串开始搜索的位置。默认为第一个字符,第一个字符索引值为0。
end – 字符串中结束搜索的位置。字符中第一个字符的索引为 0。默认为字符串的最后一个位置。
字符串的startswith函数
- 功能:用于检查字符串是否是以指定子字符串开头,如果是则返回 True,否则返回 False。 如果参数 beg 和 end 指定值,则在指定范围内检查。
- 用法:startswith(str, beg=0,end=len(string))
str – 检测的字符串。
strbeg – 可选参数用于设置字符串检测的起始位置。
strend – 可选参数用于设置字符串检测的结束位置。
字符串的endswith函数
- 功能:法用于判断字符串是否以指定后缀结尾,如果以指定后缀结尾返回True,否则返回False。可选参数"start"与"end"为检索字符串的开始与结束位置。
- 用法:str.endswith(suffix[, start[, end]])suffix – 该参数可以是一个字符串或者是一个元素。
start – 字符串中的开始位置。
end – 字符中结束位置。
还有很多函数find、index、strip、lsstrip、rsstrip、replace
字符串返回bool类型的函数:isspace、istitle、isupper、islower
join 和 split方法的使用,join将序列中的元素以指定的字符连接生成一个新的字符串,split恰好相反,拆分字符串的
字符的编码格式:gbk中文编码
ascii英文编码
utf-8 国际通用的编码格式
结果为:
74667,
123ab
字符串的转义字符:
- 字符串药转成其他含义的功能
- +字符
结果:
python中列表和元组的常用方法
- len
- 列表(元组)之间的累加与乘法
- in
- not in
- inset
- append
- count
- remove
- reverse
条件控制
Python 中用 elif 代替了 else if,所以if语句的关键字为:if – elif – else。
1、每个条件后面要使用冒号 :,表示接下来是满足条件后要执行的语句块。
2、使用缩进来划分语句块,相同缩进数的语句在一起组成一个语句块。
3、在Python中没有switch – case语句。
循环语句
Python 中的循环语句有 for 和 while。
while 判断条件(condition):
执行语句(statements)……
如果 while 后面的条件语句为 false 时,则执行 else 的语句块。
while <expr>:
<statement(s)>
else:
<additional_statement(s)>
Python for 循环可以遍历任何可迭代对象,如一个列表或者一个字符串。
for <variable> in <sequence>:
<statements>
else:
<statements>
迭代器与生成器
1.迭代器:
迭代是Python最强大的功能之一,是访问集合元素的一种方式。
迭代器是一个可以记住遍历的位置的对象。
迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。迭代器只能往前不会后退。
迭代器有两个基本的方法:iter() 和 next()。
字符串,列表或元组对象都可用于创建迭代器:
2.创建迭代器:
把一个类作为一个迭代器使用需要在类中实现两个方法 iter() 与 next() 。
如果你已经了解的面向对象编程,就知道类都有一个构造函数,Python 的构造函数为 init(), 它会在对象初始化的时候执行。
iter() 方法返回一个特殊的迭代器对象, 这个迭代器对象实现了 next() 方法并通过 StopIteration 异常标识迭代的完成。
next() 方法(Python 2 里是 next())会返回下一个迭代器对象。
class MyNumbers:
def __iter__(self):
self.a = 1
return self
def __next__(self):
x = self.a
self.a += 1
return x
myclass = MyNumbers()
myiter = iter(myclass)
print(next(myiter))
print(next(myiter))
print(next(myiter))
print(next(myiter))
print(next(myiter))
3.生成器:
在 Python 中,使用了 yield 的函数被称为生成器(generator)。
跟普通函数不同的是,生成器是一个返回迭代器的函数,只能用于迭代操作,更简单点理解生成器就是一个迭代器。
在调用生成器运行的过程中,每次遇到 yield 时函数会暂停并保存当前所有的运行信息,返回 yield 的值, 并在下一次执行 next() 方法时从当前位置继续运行。
调用一个生成器函数,返回的是一个迭代器对象。
函数
1.定义函数:
函数代码块以 def 关键词开头,后接函数标识符名称和圆括号 ()。
任何传入参数和自变量必须放在圆括号中间,圆括号之间可以用于定义参数。
函数的第一行语句可以选择性地使用文档字符串—用于存放函数说明。
函数内容以冒号 : 起始,并且缩进。
return [表达式] 结束函数,选择性地返回一个值给调用方,不带表达式的 return 相当于返回 None。
def 函数名(参数列表):
函数体
参数传递:
类型属于对象,变量是没有类型的;
可更改(mutable)与不可更改(immutable)对象:,strings, tuples, 和 numbers 是不可更改的对象,而 list,dict 等则是可以修改的对象。
Python 解释器能够用参数名匹配参数值。
def printinfo( name, age ):
"打印任何传入的字符串"
print ("名字: ", name)
print ("年龄: ", age)
return
#调用printinfo函数
printinfo( age=50, name="runoob" )
def functionname([formal_args,] *var_args_tuple ):
"函数_文档字符串"
function_suite
return [expression]
不定长参数:
加了星号 * 的参数会以元组(tuple)的形式导入,存放所有未命名的变量参数。
匿名函数
python使用lambda创建匿名函数,所谓匿名,意即不再使用 def 语句这样标准的形式定义一个函数。
lambda [arg1 [,arg2,.....argn]]:expression
lambda 只是一个表达式,函数体比 def 简单很多。
lambda的主体是一个表达式,而不是一个代码块。仅仅能在lambda表达式中封装有限的逻辑进去。
lambda 函数拥有自己的命名空间,且不能访问自己参数列表之外或全局命名空间里的参数。
虽然lambda函数看起来只能写一行,却不等同于C或C++的内联函数,后者的目的是调用小函数时不占用栈内存从而增加运行效率。
匿名函数有个限制,就是只能有一个表达式,不用写return,返回值就是该表达式的结果。
用匿名函数有个好处,因为函数没有名字,不必担心函数名冲突。此外,匿名函数也是一个函数对象,也可以把匿名函数赋值给一个变量,再利用变量来调用该函数。
匿名函数的使用场景:
可以和其他函数联合使用:map(),
map函数,函数接收两个参数,一个是函数,一个是Iterable,map将传入的函数依次作用到序列的每个元素,并把结果作为新的Iterator返回。
reduce()函数:
reduce把一个函数作用在一个序列[x1, x2, x3, …]上,这个函数必须接收两个参数,reduce把结果继续和序列的下一个元素做累积计算,其效果就是:
reduce(func,[1,2,3]) 等同于 func(func(1,2),3)
对于序列内所有元素进行累计操作
filter函数:filter()也接收一个函数和一个序列。和map()不同的是,filter()把传入的函数依次作用于每个元素,然后根据返回值是True还是False决定保留还是丢弃该元素。
对于序列中的元素进行筛选,最终获取符合条件的序列
sorted函数:
sorted(iterable, /, *, key=None, reverse=False)
接收一个key函数来实现对可迭代对象进行自定义的排序
可迭代对象:主要与列表,字符串,元祖,集合和字典
key:接受一个函数,根据此函数返回的结果,进行排序
reverse:排序方向,默认为从小到大,reverse=True为逆向
强制位置参数:
Python3.8 新增了一个函数形参语法 / 用来指明函数形参必须使用指定位置参数,不能使用关键字参数的形式。
在以下的例子中,形参 a 和 b 必须使用指定位置参数,c 或 d 可以是位置形参或关键字形参,而 e 和 f 要求为关键字形参:
def f(a, b, /, c, d, *, e, f):
print(a, b, c, d, e, f)
正确使用:
f(10, 20, 30, d=40, e=50, f=60)
错误使用:
f(10, b=20, c=30, d=40, e=50, f=60) # b 不能使用关键字参数的形式
f(10, 20, 30, 40, 50, f=60) # e 必须使用关键字参数的形式
数据结构
- 将列表当做堆栈使用(后进先出,使用append和pop)
- 将列表当作队列使用(先进先出,append和popleft)
- 列表推导式(从序列创建列表,应用程序将一些操作应用于某个序列的某个元素,用其获得的结果作为生成新列表的元素,或者根据确定的判定条件创建子序列)
vec = [2, 4, 6]
[3*x for x in vec]
#输出为[6, 12, 18]
[[x, x**2] for x in vec]
#输出为[[2, 4], [4, 16], [6, 36]]
嵌套列表解析
可以在创建矩阵列表等用到
del语句
使用 del 语句可以从一个列表中依索引而不是值来删除一个元素。这与使用 pop() 返回一个值不同。可以用 del 语句从列表中删除一个切割,或清空整个列表。
模块
模块:把一些定义存放在一个文件中,为一些脚本或者交互式的解释器实例使用,这个文件被称为模块。
import可以导入你的模块,如果模块在当前搜索路径中。
# 导入模块
import support
# 现在可以调用模块里包含的函数了
support.print_func("Runoob")
模块除了方法定义,还可以包括可执行的代码。这些代码一般用来初始化这个模块。这些代码只有在第一次被导入时才会被执行。
每个模块有各自独立的符号表,在模块内部为所有的函数当作全局符号表来使用。
所以,模块的作者可以放心大胆的在模块内部使用这些全局变量,而不用担心把其他用户的全局变量搞混。
从另一个方面,当你确实知道你在做什么的话,你也可以通过 modname.itemname 这样的表示法来访问模块内的函数。
模块是可以导入其他模块的。在一个模块(或者脚本,或者其他地方)的最前面使用 import 来导入一个模块,当然这只是一个惯例,而不是强制的。被导入的模块的名称将被放入当前操作的模块的符号表中。
还有一种导入的方法,可以使用 import 直接把模块内(函数,变量的)名称导入到当前操作模块:from mod import a,b
from mod import *
这种导入的方法不会把被导入的模块的名称放在当前的字符表中。
__name__属性
一个模块被另一个程序第一次引入时,其主程序将运行。如果我们想在模块被引入时,模块中的某一程序块不执行,我们可以用__name__属性来使该程序块仅在该模块自身运行时执行。
每个模块都有一个__name__属性,当其值是’main’时,表明该模块自身在运行,否则是被引入。
说明: 每个模块都有一个__name__属性,当其值是’main’时,表明该模块自身在运行,否则是被引入。
dir() 函数
内置的函数 dir() 可以找到模块内定义的所有名称。以一个字符串列表的形式返回:
包
包是一种管理python模块命名空间的形式,采用“点模块名称”。
模块名称是A.B,那么他表示一个包A中的子模块B。
使用模块的时候,你不用担心不同模块之间的全局变量相互影响,采用点模块名称这种形式就不用担心不同库之间的模块重名的情况。
from sound.effects import echo
echo.echofilter(input, output, delay=0.7, atten=4)
从一个包中导入*:
from sound.effects import *
输入和输出
输出值方式:
- 表达式语句
- print()
- 文件对象的write()方法
- 标准输出文件可以用sys.stdout引用
- str.format()来格式化输出值
- 输出值转成字符串,使用repr() -函数返回一个用户易读的表达形式或str()函数 -产生一个解释器易读的表达形式
rjust() 方法, 它可以将字符串靠右, 并在左边填充空格。
如 ljust() 和 center()。 这些方法并不会写任何东西, 它们仅仅返回新的字符串。
另一个方法 zfill(), 它会在数字的左边填充 0
读取键盘输入:
- input() 内置函数从标准输入读入一行文本,默认的标准输入是键盘。
- 读和写文件:open()将会返回一个file对象,open(filename, mode);
filename:包含了你要访问的文件名称的字符串值。
mode:决定了打开文件的模式:只读,写入,追加等。所有可取值见如下的完全列表。这个参数是非强制的,默认文件访问模式为只读®。
pickle 模块
- 实现了基本的数据序列和反序列化。
- 通过pickle模块的序列化操作我们能够将程序中运行的对象信息保存到文件中去,永久存储。
- 通过pickle模块的反序列化操作,我们能够从文件中创建上一次程序保存的对象。
python的os
- UID和GID标识符:系统管理器授权每个进程每个进场使用一个给定的UID标识符,每个被启动的进程都有一个启动该进程的用户UID。子进程和夫进程有一样的UID。用户可以是某个组的成员,每个组也有一个GID标识。
- 作用:当一个进程的SETUID位打开,它有效的UID将变成相应可执行文件的所有者UID,而不是当前使用该进程的用户的UID。当一个进程试图打开一个文件时,系统将检查它有效的UID,而不是真正的UID。(即临时拥有)
python面向对象
面向对象:
class(类):用来描述具有相同的属性和方法的对象的集合。它定义了该集合中每个对象所共有的属性和方法。对象是类的实例。
类变量:类变量在整个实例化的对象中是公用的。类变量定义在类中且在函数体之外。类变量通常不作为实例变量使用。
数据成员:类变量或者实例变量, 用于处理类及其实例对象的相关的数据
方法重写:如果从父类继承的方法不能满足子类的需求,可以对其进行改写,这个过程叫方法的覆盖(override),也称为方法的重写。
局部变量:定义在方法中的变量,只作用于当前实例的类。
实例变量:在类的声明中,属性是用变量来表示的。这种变量就称为实例变量,是在类声明的内部但是在类的其他成员方法之外声明的。
继承:即一个派生类(derived class)继承基类(base class)的字段和方法。继承也允许把一个派生类的对象作为一个基类对象对待。例如,有这样一个设计:一个Dog类型的对象派生自Animal类,这是模拟"是一个(is-a)"关系(例图,Dog是一个Animal)
实例化:创建一个类的实例,类的具体对象。
方法:类中定义的函数。
对象:通过类定义的数据结构实例。对象包括两个数据成员(类变量和实例变量)和方法。
模块
模块,英文名称module,扩展名为.py的文件就可以称作模块。
包
包,英文名称package,在模块之上的概念,为了方便管理.py模块文件进行打包,包目录下第一个文件必须是_init_.py。否则就是普通的文件夹目录,然后是一些模块文件和子目录,假如子目录中也有_init_.py,那么它就是这个包的子包了。
库
库,英文名称library,具有相关功能模块的集合,这也是python的特色,具有强大的标准库、第三方库以及自定义模块。