python notebook

发布时间 2023-12-07 21:43:00作者: 兔兔求放过鸭

python(11.20--12.7)

配置python环境:

下载:

anaconda在清华大学开源软件镜像站中选择合适的镜像进行下载。

anaconda的存在和作用:

要使用anaconda不妨先了解anaconda是什么,做什么。

首先要知道,anaconda的存在必然有其存在的社会条件,现如今的python拥有众多版本,他们可以满足使用者不同的开发需求。就比如有python_32位版和python_64位版本制作的可执行打包文件可以更好在对应位数的电脑下使用。在同一台电脑上下载多个不同版本的python让人头晕,也常常伴有搞混的风险,为了避免此类事件的发生,anaconda应运而生

anaconda的作用

简单来说,anaconda是包的管理器。他能够获取包并对其进行管理。

你可以创建不同的环境并在不同环境中装不同版本的python或者其他工具。不同环境之间切换简单,互不干扰。

使用:

Powershell prompt

在anaconda中我们可以找到Powershell prompt它(带有prompt函数)可以打开一个带有主题的cmd,被设计用来完成特殊的任务。

在这里指的就是解析一些conda指令和pip指令

配置环境

第一个位置的是anaconda的整个文件

第二个位置是anaconda文件中Scripts文件

第三个位置是anaconda文件中的Library\bin

第四个位置是anaconda文件中的Library\mingw-w64\bin

指令:

可以通过输入conda,pip列出他们的各种指令

conda init:可以添加conda到环境变量中,以便于快捷使用

conda search+文件名称:查找对应文件,主要用于查找版本号并在下载时使用

conda install+文件名=版本号:如conda install python=3.12,就是下载python的3.12版本当安装多个包时用空格隔开

​ conda install可以将包配置在当前激活的环境

conda create -n 环境名称 包名称=包版本号:创建一个环境并在里面安装该包

conda remove -n 环境名称 --all:删除一个环境 此处的n是name的缩写

conda info -e:查看全部环境名称。

# conda environments:
#
base                     C:
Datawhale                C:
tf                    *  C:

其中包含了环境名称,环境文件所在位置。

带有*的环境是当前所处环境,默认打开的是base环境

conda activate 环境名称:打开该环境变量

conda deactivate :退出该环境变量到上一个环境

conda list:列出当前环境中存在的包

conda clean -i

conda clean -p 清理多余的包

python

习惯

在python中双引号,单引号没有区别。但是单引号会匹配单引号。双引号匹配双引号

数数从0开始,左闭右开,不输默认。

注意行对齐

python需要多加注意代码规范,养成良好的代码习惯。主要是代码对齐的问题

c语言的变量盒子比喻对于python而言并不是那么适宜,python的变量更像是一个标签

!!python和c语言有一点不同,它可以用一些已经引用的名词作变量

max=[1,2,3,4,5]
print(max)S
#他不会报错但是我们要避免这样的操作。因为这样以后你的max函数会出错误。

返回值

公式本身和返回值之间是等价。

所以接下来所说的返回值可以理解为此公式替换成了这个返回值

注释:

单行注释

“”“

多行注释

”“”

*变量

python也是面对对象的编程语言,你了解对象么???

要想学习python不如先了解好python所面对的对象有什么,是什么。

类型

变量在重新赋值时不需要考虑变量的类型

str(字符串,单个字符使长度为1的字符串)
float(默认双精度)
list
bool
int

除此之外type,数组(numpy )等等还有很多类型。

注释:同一段代码对当变量类型不同时会产生不同的效果:

    譬如print(a+b)
    当a="1"b="2"时,将输出12(str)类型
    当a=1,b=2时,将输出3(int)
    又如a*2时,str会显示两个1也就是11
              int会显示1*2得结果也就是2

​ 对于类型的操作:
​ type可以查看某个数据的类型
​ 数据类型()可以强行改变数据类型
​ 如int("1")就是将字符1转化为整型1

整型,浮点型(数字型数据类型):

可以对数字数据进行数学处理。

int类型将省去小数部分。

这意味着,如果将一个浮点型转化为整形,他的小数点后部分会消失而不会进位

num1/num2得浮点型(无论结果是否有小数部分)

num1//num2得整型

在print中,他不能与字符型数据类型用"+"相连。

整型与浮点型做运算,除整除和除外,有浮点型参与得结果为浮点型(无论是否有小数点后部分)

数字型数据类型的运算
+ python中不存在a++,只能写成a+=1的形式加减乘除同理
- 减法
* 乘法
/ 除法,其结果无论如何输出float形式数据
% 除余
** 指数运算(可以乘法也可以开平方)
// 整除

除了整型,浮点型以外,布尔(bool)和复数(complex)也是数字型数据类型

布尔类型有True 和False两个(True和False在+-时会被当成1,0)

字符型数据类型:

str字符串:引号是字符串的标识,用input获得的输入值默认为字符型。如果想要输入其他类型则需要通过改变数据类型实现

字符串切片

假设一个字符串a="asd"

​ b="宗洪"

字符串中每位字符都有自己的序号(汉字,英文,数字所占位数相同)

根据位置关系,我们可以定向查找某个字符,输出某个字符,改变某个字符。

字符的序号是从0开始计算的,由上述例子来讲也就是

a[0]为"a"

b[0]为”宗"

(括号实际上应该[ A : B : C ]如此,三个位置为整型,可以是变量可以是常量A为起始点,B为终止点,C为间距ABC之间由":"进行分割,

单独输入一个数字时,表示第几个字符。输入[ A:B ]时默认间距为1,当AB为空白时,默认为到头。C可以是一个负数,使得这个切片倒向走)

字符串的运算

字符串+字符串是将两个字符串连接在一起。

字符串*数字,将返回”数字“次的字符串

print("asd"*3)
#将输出asdasdasd

列表:

list。。。输入赋值一个列表可以用input().splist()。

每组列表用[]括起来

列表可分为分维,按照维的多少可以分为一维列表,二维列表等等。

list[]可以类比二维数组,但与其说是数组不如说更像是结构体。(动态数组赋值的数组也挺像的)

list是一串线空间,而这串线空间上的每个点都可以编制出新的线空间。

每个点都是独立的,也就是说,有的点可能就是一个点,而列表上有的点却也是个列表,并且,同一维分出的列表不一定等长

列表的定义

list=[1,2,3,4,5]#此处不加引号和小数点默认为整型
list = input().split()#允许以空格作为间隔的多次输入
<!--split是连续输入的标志split括号中的内容是每次输入之间的标志-->
#比如
list= input().split(",")#以逗号为间隔将内容输入到list列表中
list= input().split(" ")#默认模式
#split实际上起到了分割字符串的作用以split阔靠里的内容将前文进行分割并以字符串列表的形式返回

二维列表反转

list1=list(map(list, zip(*list1)))#此函数可以将二维列表反转

"""
1 2 3           1 4 7
4 5 6   ==>>    2 5 8         
7 8 9           3 6 9          
类似于numpy的array.T矩阵反转
"""
运算:

list.append()可以把括号里的内容写入列表list的最后一个

list.count()返回()中内容在list中出现的次数

list.reverse()倒叙返回列表

list*数字。将列表中的内容乘以“数字”并以列表的类型返回。

list+list两个列表的整合

数据 in list:在列表中寻找这个数据,如果存在则返回True如果不存在则返回False

for i in list:将list的数据分别赋值给i并在每次赋值以后进行":"后的操作。

列表存在切片的功能,与字符串的切片有着相同的规则

错误:

列表的每个点更像是一个位置坐标,这也就是说,在我们将一个row列表添加到list列表作为一个元素

后,如果我们更改row列表,list列表中row列表对应的位置也会受到影响,如果此时我们给row列表*3

赋值给list的一个元素,我们会获得一个拥有三个子列表的列表。但是若之后更改row列表,我们会发现在list列表中的三个row列表将全部被更改了(类似指针,列表中存入的是一个地址而非真实的量)

同时

row1=row也是如此,当row'更改时row1也会被更改,如果我们只想把row中的数据赋值给row1,我们应该利

用.copy将row中的数据复制给row1

屏幕截图 2023-11-21 150416 屏幕截图 2023-11-21 150715

*语句:

基本语句

return:

return是返回,在python中可以标定调用函数的返回值。

return后的数据是该函数最终的形态。

调用函数:

def+函数名字+:

需要首行缩进来标定调用函数的整体

def st(a):
    a*=4
    return a
a=4
a=st(a)
print(a)
sum:

sum(list):

将sum括号中的各个数据做和。

reversed:

倒置内部数列,列表。

range(11,1,-1)=reversed(range(1,12))
#相比于前者,我们更推荐使用后者。最起码我认为前者如果要倒序到0则无法实现
abs():

绝对值。。。。。。

import:

引用库

用法:

import 库名

import 库名 as 库别名

不同的库中可能有函数名相同而作用不同的函数。

import numpy as nu#之后我们可以用nu.numpy中的函数名来调用函数
a=nu.array(list)#array是numpy。nu.表明使用numpy库中的array函数而不是其他库中的array函数
def:

写函数。

#def compare(a,b):
    if a>b:
        return b
    else:
        return a
d=10
e=5
c=compare(d,e)
"""
c等于e等于5
"""
print输出:

python中也存在转义字符

如\n为回车

如果不想按照转义字符输出可以在“引号”之前加上r(repr(str))来让转义字符失效

print():将输出括号的内容。<!---上文提到""是字符的标识,”“中的内容将被当作字符直接输出--->

print(f""):这种输入方法常常用在字符与变量交替出现的输出中在""中可以加入{},{}中存入的变量可以按照变量输出

print(f"xx{x}")(x=1)
输出结果:xx1

可以用print("""

输出内容1

输出内容2

""")

print(输出内容,end=结尾内容)结尾内容默认为换行,可通过end=来替换结尾内容

input输入:

input()括号中内容将会输出在命令行,可以作为提示性语句,input可以接受空格。

a=int(input("请输入一串数字"))

将输出“请输入一串数字,”输入的数字将会转化为整型被返回到a变量中

因为input输入的内容默认为str的字符型,所以我们可以通过这种方式输入一个整型的数据赋值给a或者你也可以在赋值以后再用类型转化直接作用a变量

接下来三个变量需要用到引号

{

while循环:

while 条件:

i=0
while i<20:#如果已知循环一次不建议用while
	print("1")
	i+=1
else:
	print("0")

在python中else可以同while和for等语句使用。else后语句运行的条件是while(for)因条件不成立而退出循环,这意味着通过break跳出的循环无法执行else后的语句。(无论break时while后的条件成立与否)

for循环:

for循环遍历

for i in range(10)#range(10)是一个迭代器,他可以返回一个0到9的整数序列,i遍历0-9,期间i每取到一个值,循环语句运行一次
如果只想让for循环一定次数可以使用:
for _ in  range(11)
#老师是这么说的,但是我试了试,print(_)还是输出了

此外,如果将range换成一个列表,那么i会遍历列表中的所有取值。

range后的括号也像切片一样可以延申为三个数值与切片作用相同并用逗号进行分割。

if:

not 命题为逆命题,代替!命题

if 加条件。当条件满足时执行冒号引起的语句,不满足时则跳过。

graph TD; A-->B{if判断} B-->C B--是--->D D-->C

<c中的else if语句在python中被简化为elif语句。>

else:

else可以跟在这些有条件判断的语句后面。

需要注意首行缩进的问题。

用在if后面,当if的条件成立时执行if的语句,当条件不成立时执行else的语句。

用在for和while语句,可以在循环正常结束以后(不是因break退出的循环)执行else语句

match case;

主要作用是代替大量的if--elif--else

match str: 对比swtich

​ case str1:

​ 语句

​ case str2:

​ 语句

​ case str3:

​ 语句

​ case str4:

​ 语句

​ case str5:

​ 语句

​ case _:

​ 语句

此类代码只有当语句后的条件成立后才能执行冒号后面 的语句

python用首行缩进来确定语句的整体性

冒号后面也可以不换行缩进,但是此行为不推荐

}

迭代器:

迭代器以一个列表或序列为对象,每次使迭代器返回一个值时,迭代器会在列表中抽取一个值返回。

当迭代器已经遍历所有数值,再次遍历时将输出一个StopIteration,这个返回值在判断循环的判断中将会使循环结束。

iter:

iter是迭代器的一种

a=iter(list)#意思是将list遍历并赋值给a,每次取用a会经历list中的一个值
print(next(a))
>>list[0]
print(next(a))
>>list[1]#被赋值为迭代器的a是一中新的类型,与list中的数据类型无关
range:

range()迭代器会返回遍历range括号中的内容

a=range(0)
print(a,type(a))#此时a的值将输出range(a,10),他的数据类型为range

range常用在for循环中的计数中,遍历也可以体现在循环次数中

enumerate:
enumerate(list)

这个迭代器可以迭代list列表,tuple元组等类似数组的结构

返回值为一个元组,可以分为两部分(a,b)其中a是返回值的下标,b是返回的数据

(b也可以是一组数据)

例如

arr=[1,4,5]
for i,a in enumerate(arr):
    ptint(i,end=" ")
    print(a)
    
    
    """
    输出的值为
    1 0
    4 1
    5 2
    """
若改为for i in enumerate(arr):
    print(i)
   """
   (1,0)
   (4,1)
   (5,2)
   """
map:

map(function, 多段数据)

function表示的是函数,其中函数的括号为多端数据。

1.map可以用于实现多段输入

a,b=map(int , input().split)#可以输入两个值并分别赋给a和b。

说到多段输入我们不难想到列表,我们可以通过map进行列表的输入

list=list(map(int,input().split()))#值得注意的是我们需要将数据形式转化为列表才能将这么多数据一起赋值给a

2.map可以用于数据的同一操作

def ten(a):
    return a+10
a=list(map(ten,[1,2,3,4,5]))#此时的a中便是[11,12,13,14,15]


#以上的数据等价于
a=list(map(lambda x: x+10 , [1,2,3,4,5]))
#其中x代表可以是a,可以是b,这个变量会代替接下来的赋值进行冒号后面的操作。

返回值与承接变量数目关系

需要注意,map返回一组数据时返回的函数若只有a接受,a的函数类型为map
如果map返回两个数据,恰有两个变量承接,那么单个变量的类型就是map返回的单个数据的变量
如果map返回的数据多余承接的变量将会报错。
map返回的单个列表只能一个变量承接
map返回接受的值,返回的值必然是两个及两个以上

min/max::

min()/max()可以返回括号 中的最小/最大值,括号中不同数据之间用逗号隔开

括号内也可以添加 一个列表来获取列表中最小/最大的数

len:

len可以获取字符串的长度或者list的数据个数,如果是二维列表,第二维的列表在第一维只占一个空间

in:

str in list/str

in可以在list和str中寻找in,如果存在则返回True,若不存在则返回False。

可以用 not in 来判断某个列表/数组中不存在某个数

矩阵库

import numpy as py#矩阵所要用到的一些函数包含在这里
a=np.array(list)#可以将list列表转化为对应长度宽度的数组(此时列表要遵循矩阵规则行的数据个数相同)
b=np.dot(a,c)#使两个矩阵做乘法运算,矩阵的乘法:b的*一*排/一/列是a的*一*排分别乘以c的/一/列后和,相同标记的数字时时刻相等
             #需要注意的是a的列数要与c的行数相同,而a的行数和c的列数分别与结果b的行数和列数相同。dot(a,b)与dot(b,a)的值              #不一定相同
矩阵.shape()可以返回矩阵的形状(,2行,3列)
.zeros(,):

zeros中括号中的内容是矩阵的行列。

可以创建一定行列的矩阵。

矩阵中的split:

矩阵切割split(切割对象,切割成多少份,axis=num从第几维度切割)

0表示横切

1表示竖切

字典用法(dict):

键(key):作为索引来找到字典

dict={key:value}
"""
其中的key需要一个不变量,可以是字符串,或者一个数字
如    dict2={1:10}
      dict2[1]==10
"""
dict1={"a":3,"b":"4"}#定义时不看顺序,不能重复,#若重复取最后一个#
dict1["a"]==3
dict1["b"]=="4"
del dict1["a"]#删除a的条目
dict1.clear()#删除字典的所有内容

dict["a"]="acz"

可以在字典中添加一个数据,并且根据上述字典对重复键的说明,如果字典中已经含有这个键,则会取代

元组(tuple):

元组类似于列表,用小括号包含数据

a=(1,2,3,4)
#如果a中只含有一个元素需要
a=(1,)#加一个逗号

元组是一个不变量,这意味着对于列表生效的许多功能并无法在元组中使用,这是元组与列表的差别,也是元组存在的意义

添加数据,删除数据,更改数据。这些功能在元组中都无法使用

二叉树:

pass

防止TL的方法

由筛选到定向查找

将一些实际问题转化为数学问题进行解决

学会使用python的一些内置函数

优化算法等等

快速幂

在计算过程中类似于a**b这种类型,如果b的值很大的话会拖慢程序的运行速度

此时我们可以通过将a**b这个幂的计算转化为多个乘法的计算来减少使用的时间

#比如
10\*\*6

转化为

(10**2)**3

再转化为100**2 *100

01背包问题

01背包是讲述一个实际问题。

一个负重已知的背包和一些已知重量和价值的物品,写出公式计算在不超过重量限制的前提下可以获得的最大价值

例子:

背包承重记为6

可以选择的物品有:

名称 (重量:价值)
葡萄 (2:3)
矿泉水 (3:4)
西瓜 (4:5)

背包的思想是动态规划

如果你要求拿6个重量单位的物品为最值,如果该物品是2,如果要添加这个物品且价值最大,则一定是当重量为4时的价值最大的情况加上该物品的质量

但此时仍存在一个问题就是我们无法确定在6时若不加这个物品是否可以得到更好的结果

背包重 0 1 2 3 4 5 6
0 0 0 0 0 0 0 0
葡萄(2:3) 0 0 3 3 3 3 3
矿泉水(3:4) 0 0 3 4 4 7 7
西瓜(4:5) 0 0 3 4 5 5 8

解释:由左向右,自上而下的走这个列表

根据上面对问题的描述,每个方格内的数字是由两部分比较而来的

一个数是继承上方的最大(也就是不加这个物品的最大价值)

另一个数来自背包此时负重-此物品负重后负重的最大值+此物品的价值

将两者作比较并将较打的那个放在这里

将表格完成之后取最后一个值就是最大值