Python学习笔记(在廖雪峰的网站学习过程中整理而成

!!!申明:本学习笔记基于廖雪峰的官方网站,由笔者在学习过程中整理而成,不是搬运工
附廖雪峰的官方网站:廖雪峰的官方网站

Python基础:

1.list和tuple

list和tuple:list又称列表,类似C语言或C++中的数组,但与C系列语言存在一定区别,区分度高。
list的定义:

> test = [‘test1’ , 666 , true]

此变量test即为一个list,可见list变量由中括号定义而成,且不提前对其直接进行类型定义,这是python所独有的特点;list变量也可同时存储任意类型变量,如字符、整型、布尔类型等。
list利用索引直接访问其中的元素,类似于数组下标,同数组一样,其索引也是从0开始的,访问示例如下:

test[0]
test[1]
test[2]

超出list中元素个数的范围会报IndexError错误

需要直接获取list的长度可直接使用:len( )函数

len(test)

Python支持直接访问list最后一个元素,知不知道此list的长度均可访问,访问最后一个元素和倒数第二个元素的示例如下:

test[-1]
test[-2]

list最主要的特点也是和tuple的主要区别:list是一个可变的有序表,tuple是定长的有序表,tuple可以大致等价于其他语言中的数组,当定义完成后不可更改其长度(大小)。也不可更改其中的内容,仅允许进行访问。
在list中可使用append( XXX )方法直接向list末尾添加元素XXX;也可使用insert( i , XXX )方法向该list的第 i 个位置插入XXX , 注意:索引下标从0开始;可使用pop( i )方法删除该list第 i 个元素 ; 可直接向list的指定位置赋值;所有示例如下所示:

test.append(XXX)
test.insert(2 , flase)
test.pop()#删除test末尾元素
test.pop(1)#删除test中的666
test[0] = test2

list中的元素可以是list,类似于二维数组,依次可衍生出三维数组、四维数组……

tuple又称元组,list和tuple的主要区别即为:tuple定义完成后其长度不可修改,且tuple中的元素一旦定义完成就只能访问,不能对其进行修改
tuple用小括号进行定义,tuple定义如下:

test666 = (‘test2’ , 888 , flase)

此处补充一些Python内置的关于 list 和 tuple 的函数和方法:

1.1关于list的函数:

  • len( list )
    :返回列表元素个数

  • max( list )
    :返回列表元素最大值

  • min( list )
    :返回列表元素最小值

  • list( tuple )
    :将元组 tuple 强转为列表 list

1.2关于list的方法

  • list.append( abc )
    :在列表 list 末尾添加新的对象(元素)

  • list.count( abc)
    :统计元素abc在列表中出现的次数

  • list.extend( list1 )
    :将 list1 中的所有元素整体嵌入至 list 后面

  • list.index( xxx , start , end )
    其中 start 和 end 为可选参数,satrt 表示查找的起始位置, end 为查找的结束位置
    :从此列表中找出元素 abc 第一次出现的位置,可利用 start 和 end 限制查找范围

  • list.insert( index , abc )
    :将元素 abc 插入到此 list 中下标为 index 位置上,其中指定位置 index 不可省略

  • list.pop( index )
    :移除 list 中的元素。此方法中 index 为可选,没有index这个参数是默认最后一个元素,如有 index 则要小心越界

  • list.remove( abc )
    :移除列表中值与 abc 第一个匹配的项

  • list.reverse( )
    :将列表整体逆置,此方法无参数

  • list.sort( reverse = True | False , key = listLong)
    :sort 方法对 list 进行排序 ,reverse 和 key 两个参数均为可选参数
    其中 reverse 仅有两个取值 Ture 和 False ,选取 reverse = True 为参数时,list 进行降序排列,不选此参数时默认 reverse = False
    key 为:指定一个仅代有一个参数的函数;将元素进行排序前,先送入此函数进行处理,再进行排序,下面给一个示例:

def listLong(elem):
   return len(elem)
#自定义一个函数,此函数仅带有一个参数elem,此函数的作用时返回elem的长度
   
name = ['Tom' , 'Jack' , 'K' , 'Brown']
#定义一个list
name.sort(key = listLong)
#调用sort方法,默认reverse参数 ,选取key参数
print(name)
#输出排序后的结果

选取 key 参数后,会将 key 所调用的函数结果用于 sort 排序
运行结果如下图所示:
在这里插入图片描述

1.3关于tuple的函数:

  • len( tuple )
    :计算元组元素个数
  • max( tuple )
    返回元组中元素最大值
  • min( tuple )
    返回元组中最小值
  • tuple( list )
    将列表 list 强转为元组 tuple

2. 条件判断

Python不同于其他语言,不用大括号进行封装,采取缩进规则;if-else语言的大致用法同其他语言基本一致,示例如下:

num = 100
if num < 50:
	print("Yes, num =" , num)
else:
	print("NO , num = " , num)

在Python中利用冒号“ :” 和四个空格符即一个制表符进行封装(大家注意,不同编辑环境下,一个制表符可能不是表示4个空格,可能是2个也可能是4个甚至是8个,在封装时,也就是表示缩进时,最好用4个空格表示,以避免造成不必要的麻烦。且注意,一段代码里面不要将制表符和空格混用,出现错误后很难排除,也会极大降低工作效率)

也可使用if-elif-else语句进行细致判断:

num = 100
if num < 50:
	print("num1")
elif num < 100:
	print("num2")
else:
	print("num3")

3.模式匹配

如果条件判断出口太多,过于冗长,可使用match( ) 语句进行改写,有过C语言基础的小伙伴知道switch,match的功能大致与switch相似,示例如下:

num = 100
match num:
	case 10:
		print("num1")
	case 30 | 40 | 50 | 60 | 70:
		print("num2")
	case 100:
		print("num3")
	case _:  #注意空格
		print("Error")

第二个case利用 | 进行分隔,可匹配多个值
注意最后一个case与_下划线间有一个空格


4. 循环

此节开始前先理解 range( ) 函数的用法:
函数:range( i ) , 可生成一个小于 i 的正整数序列,即生成一个0 ~ i - 1的整数序列

熟悉range( )函数后可实现0~100的正整数求和

利用 list(range( 101 )) 可生成一个包含100个元素的list

使用 for-in 可对其进行遍历,也可进行求和,示例如下:
类似于C++中的for循环

for x in list(range( 101 )):
	print(x)
#上述代码实现顺序输出0~100

sum = 0 
for x in list(range( 101 )):
    sum = sum + x	
print(sum)
#上述代码实现对0~100求和

使用 while循环 也可实现100以内的正整数求和,和其他语言类似,只要 while 条件1 中的条件1 始终成立,则执行循环内容
利用while进行100以内正整数求和示例如下:

sum = 0 
i = 100
while i > 0:
    sum = sum + i
    i = i - 1
print(sum)

相信很多学习过其它语言的小伙伴对break语句和continue语句的区别还是有些模糊,在下面的例子中笔者用Python给大家解释解释

break和continue的区别:
break语句会结束当前循环,跳出循环;continue语句会结束此轮循环进入下一轮循环,直到循环条件不成立才会跳出循环。此处的循环常见的有forwhile
通常提到break时需要与contiune进行对比,两者有明显区别
示例代码以输出10以内的奇数为例
下面是break示例:

n = 0
while n < 10:
    n += 1
    if n % 2 == 0:
    	break
    print(n)
print('END')

if 语句判断的是当n为偶数时就会执行break,当while循环结束后输出END表示此段代码结束,执行结果如下图所示:
在这里插入图片描述
可以看到当 n 为 2 时执行了 if 判断下的break语句,此后while循环结束,输出了END;break语句使得while循环提前结束,直接跳出了循环,循环结束时 n 的值为 2,并没有执行到循环条件不成立

下面是continue示例:

n = 0
while n < 10:
    n += 1
    if n % 2 == 0:
    	continue
    print(n)
print('END')

此段代码与上述 break 示例一致,只是break替换成了continue,执行结果如下图所示:
在这里插入图片描述
当 n 第一次为偶数 2 时执行了 if 判断下的continue 其后并未执行 print(n) 跳出了此轮 while 循环,而是回到了对 n 的判断,此时 n 为 2 , n < 10 任然成立,随后进入while循环内部 ,首先自加 1 ,然后用 if 进行偶数判断,此时不成立,执行 print(n) , 此轮循环结束……循环往复直至 while 判断条件 n < 10 不成立,随后输出END,此段代码结束

注意!break语句和continue语句通常必须配合 if 语句使用

5.dict 和 set

5.1 dict

dict 全程 dictionary ,为Python内置的字典,在有些编程语言中也称之为map。
使用键—值(key-value,也可以理解成索引),所具备的优势是其查找速度极快。
其大致原理如同使用字典一样,通常情况下使用字典查字我们会使用拼音或部首查字法,不认识的字大多使用部首查字法,先查偏旁部首,再通过除偏旁部首以外部分的笔画进行进一步查找,最后找到该字,再进入相关页码查看关于这个字的相关信息。
在语文课上使用的字典,其中的偏偏旁部首就可以看作是此处的 key , 用偏旁部首查到的字就是我们需要的 value ,可以理解为就是常说的 索引
dict 的特点:

  • 查找和插入速度快,不会因元素数量的增加而降低查找和插入的速度
  • 需要占用大量内存空间

dict 的初始化定义日下所示:

dic1 = {key1 : value1, key2 : value2 }
dic2 = {'A' : 10, 123: 20 , 'B': (1 , 2),'C': True , 'D': 'abcd' , 'E':[1 , 2] }

dict 为Python内置的关键字,所以不要以 dict 命名变量
其定义方式为:用大括号定义,其中的关键字:(也就是冒号) 分隔开,元素与元素之间用 ,(逗号) 分隔

注意事项:dict 的关键字,也就是key是唯一不可变的对象

dict 的关键字,又称键值,即 key 可以是任意的不可变数据类型(字符,数字,字符串,元组……), key 定义完成后不可变且在此 dict 中唯一
每个关键字所对应的 值(value) 也可以是任意数据类型(数字,字符,字符串,布尔类型 , list(列表),tuple(元组)……)
回忆前面的知识点我们可以知道,list 是可变的 , 而 tuple 也就是元组,一经定义完成后就不可变了。所以在字典中,list只能充当value的角色,不能用作key的定义;而tuple可实现两个角色

dict 的访问如下所示:

dic2 = {'A' : 10, 123: 20 , 'B': (1 , 2),'C': True , 'D': 'abcd' , 'E':[1 , 2] }

dic2['A'] , dic2[123] , dic2['E']
#访问字典中的关键字所对应的值

#输出示例
print(dic2['A'])

print(dic2[123])

print(dic2['B'])

dict 的访问格式:名字+方括号,方括号中放 key
输出结果如下:
在这里插入图片描述

除了初始化定义 key 所对应的 value 外,也可以通过 key 插入 value,示例如下:

dic2['A'] = True

也可用过此方式修改某 key 所对应的 value,但一定切记!key 值不可变!
添加元素的操作类似(会默认将添加的元素衔接至末尾):

dic2[(22,22)] = 1024

删除字典中的元素,清空所有项,删除字典

del dic2['A']
#删除dict中指定的key和其对应的value
print(dic2)

dic2.clear()
#清空dict中的所有项
print(dic2)

del dic2
#删除dict

前两个方法运行后的结果如下所示:
在这里插入图片描述
注意事项:dict 字典的特性

  • dict 的定义中不允许同时出现两个一样的 key , 如果有两个或更多一样的 key 定义完成,默认会记录最后一个 key
  • dict 的 key 一定是不可变对象,可用 list 和 tuple 加深记忆

要查询某个 key 是否存在此 dict 中两种方法:
1.用in 进行判断,返回值为False 或 True;例如:'Z' in dic2
2.用 get 方法进行查询

关于 dict 的内置方法和函数

1.函数

  • len(dict)
    :计算字典中元素的个数,即 key 的个数

  • str(dict)
    :将字典强转为字符串

  • type(elem)
    :返回 elem 的类型,如果 elem 为 dict 则会返回dict

2.方法

  • dict.clear()
    :清空字典中的所有元素

  • dict.copy()
    :浅拷贝dict;具体解释即样例见链接:菜鸟教程对直接赋值和copy的解释

  • dict.fromkeys(seq[, value])
    :有一个名为 seq 的元组,用此方法声明了一个 dict ,其中 dict 的 key 用的是 seq 中的元素 ;value为可选参数,当不选 value 时默认用 None 作为新字典每个 key 所对应的 value ,选上了value就用此值作为所有key所对应的

  • dict.get(key , elem)
    :elem为可选参数,查找 dict 中 key 所对应的 value ,如果 dict 中没有这个 key 就返回 elem ,elem可为任意值

  • dict.items()
    :返回一个数组,这个数组中的元素是元组tuple , 数组中的每个元组元素包含字典中的 key 及其对应的 value

  • dict.keys()
    :返回一个 列表list ,此 list 是由 dict 中的所有 key 所组成的;也就是提取 dict 中的所有 key ,用 list 进行封装并返回

  • dict.values()
    :返回一个 列表list ,此 list 是由 dict 中的所有 value 所组成的;也就是提取 dict 中的所有 value ,用 list 进行封装并返回

  • dict.setdefault(key, elem)
    :在 dict 中查找 key 所对用的 value ,找到了则返回此 value;如果没找到,就将此 key 和 elem(也就是此key所对用的value)嵌入至 dict 的末尾,并返回 elem

  • dict.update(dict403)
    :将 dict403 嵌入到 dict 的后面

  • dict.pop(key , elem)
    :删除 dict 中 key 所对应的 value ,并返回此value;如果 key 不存在,则返回elem

  • dict.popitem()
    :删除 dict 中最后面的 key 及其对应的 value, 并返回此 key 和 value;如果dict已经为空了,则报KeyError异常

5.2 set

set 和 dict 类似,但 set 只是一组 key 的集合,没有 value ;和 dict 一样,存放在 set 中的元素只能是 不可变对象!
创建 set 如下所示:

text = set( [1 , 2 , 3] )
#创建一个set ,是用小括号括起来一个list
print(text)

上诉代码段运行结果:
blog.csdnimg.cn/direct/aa77522d904b4fee85c5ba4b2baa4c23.png)因为 **set** 和 **dict** 相似,set 是一组 key 的集合,所以其中的元素==唯一==

可以使用 add 方法添加元素:

text.add(4)

如果添加了原 set 中已有的元素,则不会有任何效果

可以使用 remove 方法删除元素

text.remove(2)

在数学定义中,我们可以将 set 看作是无序无重复元素集合
因此,set 与 set 之间可以做交集、并集等数学计算,下面给出示例:

text1 = set( [1 , 2 , 3] )
text2 = set( [1 , 3 , 5] )

print("交集运算:" ,  text1 & text2)
#交集运算
print("并集运算:" , text1 | text2)
#并集运算


运行结果:
在这里插入图片描述

不可变对象

Python 中常见的
可变对象:list ,dict ,set

不可变对象:tuple ,string ,int ,float ,bool
要说到可变对象和不可变对象,绕不开的就必须得讲到地址问题 , 如果有学过C系列语言的同学觉得很难理解或基本理解,可跳过此小节

1.可变对象:

text1 = [1 , 3 , 5]
#text1是一个可变对象list

text2 = text1
#text2和text1指向同一地址
print("原text1的地址:", id(text1))
print("原text2的地址:", id(text2))
print("原text1: " , text1)
print("原text2: " , text2)


text1[1] = 2
#改变可变对象text1中的某个元素
print("改变元素后text1的地址:", id(text1))
print("改变后的text1: " , text1)
print("text1改变后text2的的值" , text2)
print("text1内的元素改变后,text2的地址:", id(text2))

上述代码运行结果:
在这里插入图片描述
可以看到,两个不同的 可变对象 同指一个地址时,当此地址上的保存的内容都发生改变后,两个 可变对象 里的内容都会发生相应改变
而两个 可变对象 的地址都没有发生任何变化

2.不可变对象:

abc1 = (2 , 4 , 6)
#abc1是一个不可变对象tuple

abc2 = abc1
#abc2和abc1指向同一地址
print("原abc1的地址:", id(abc1))
print("原abc2的地址:", id(abc2))
print("原abc1: " , abc1)
print("原abc2: " , abc2)

#因为此处的变量均为不可变对象tuple,所以定义完成后无法改变其中的元素
#所以要改变abc1中的元素只能进行如下操作
abc1 = (1 , 2 , 3)

print("改变元素后abc1的地址:", id(abc1))
print("改变后的abc1: " , abc1)
print("text1改变后abc2的的值" , abc2)
print("text1内的元素改变后,abc2的地址:", id(abc2))

上述代码运行结果:
在这里插入图片描述
不可变对象 所指地址上的内容在定义完成后无法进行改变,想要改变已经定义完成的 不可变对象 里的内容,只能重新进行定义,此时这个不可变对象 中的内容和其地址都发生了改变


函数:

如果有C系列语言 (笔者对C系列语言最熟悉,所以以此为例) 学习经历的小伙伴对函数应该是比较熟悉了。除了有库中自带的函数,例如数学库中带有一系列数学函数,仅需了解输入值也就是要传递进函数的参数,以及输出值,可以直接进行调用。
除此之外,我们也可以自定义一系列需要的函数,提前将一段代码段进行封装,后面有需要直接进行调用即可。
Python作为主流编程语言的一种,也支持函数,除了自带库中的函数,也可以进行自定义。

1.调用函数

此处给出Python官方函数文档,如有需要可自行查阅
不论是调用已有的库函数,还是调用自定义函数,都需要了解此函数需要传进去的参数个数及参数的具体含义及类型
如果传入的参数数量不对,会报 TypeError 错误;如果参数类型错误,同样会报 TypeError 错误
Python内置函数中,常用的函数也包括数据类型转换函数,也有称之为强制类型转换,下面给出一些简单示例:

a = int(10.2222)
#将浮点类型值10.2222转换成整型,并赋值给a
print(a)

b = float('101.101')
#将字符串值101.101转换成浮点型,并赋值给b
print(b)

c = bool(1)
#将整型1转换成布尔类型,并赋值给c
print(c)

下图为上述代码段输出结果:
在这里插入图片描述

2.定义函数

Python 中使用 def 语句进行函数定义,格式为:def + 函数名 + 括号 + 括号内为此函数的参数 (参数可以没有,此时可以自定义函数功能,例如延时等)+ 冒号;然后使用缩进格式进行封装
通常情况下自定义函数都需要有返回值,也就是说要使用 return语句 返回此函数得到的结果,所以一旦执行到 return语句 时此自定义函数即执行完毕
也可以不返回任何值,不使用 return语句 ,但此时函数执行完毕后也会返回一个None ,不使用 return 等价于 return None 等价于 return (此return后面没有任何参数)
下面给出一个自定义判断偶数的函数:

def evenNumber(x):
	if(x % 2 == 0)
		return True

前面说到,在调用Python自带的函数时,也就是库中的函数时,Python解释器能够判断用户在调用函数的过程中,传进去的参数个数是不是正确,参数的类型是不是符合所调用函数的要求;这两个要求有一个不满足,就会抛出 TypeError
但是在调用自定义函数时,Python解释器只能判断函数的个数是否符合要求,并不能判断其类型是否满足

所以我们可以说现在的自定义函数不健全
以上述自定义判断偶数的函数为例,我们可以进行如下修改:

def evenNumber(x):
	if not isinstance(x , int):
		raise TypeError('Type error')
	if(x % 2 == 0):
		return True

isinstance(object, classinfo) 函数是用来判断对象 object 是否是已知的类型 classinfo ;其中 classinfo 可以是直接或间接的类名,可以是基本数据类型,也可以是由它们组成的元组;返回值是布尔类型
**raise:**在Python中使用raise可以抛出一个用户指定的异常,只有一个参数,这个参数就是用户指定的异常,在上述例子中 TypeError(‘Type error’) 就是参数
函数返回多个参数时
用户自定义的函数可以返回多个值,下面给出示例:

def abc(x):
	a = 2 * x
	b = 3 * x
	return a , b
#自定义一个函数abc,传入一个参数x,可以返回2*x和3*x的结果

x1 , x2 = abc(20)
#当函数有多个返回值时,可以用相应个数的变量接收
print(x1)
print(x2)

print(abc(10))
#当函数的返回值有多个时,实质上返回的是一个元组tuple

上述实例代码段运行结果:
在这里插入图片描述
当函数返回多个参数时,可以用相应数量的变量去接收;但实质上,当一个函数返回多个参数时,此函数返回的是一个元组tuple
不仅限于自定义函数,调用Python自带的函数也是同样的结果


持续更新中……

  • 23
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值