一、python 基本操作
1、常见pep8规范:
PEP 8是Python社区普遍采用的一份编码规范,包括代码风格、命名规范、代码布局等方面的约定。遵守PEP 8可以让你的代码更加易读易懂、易于维护,提高代码质量。以下是PEP 8的一些重要规范:
函数和方法的命名
函数和方法的命名应该使用小写字母,单词之间用下划线分隔,以便于阅读和理解。
函数和方法的名称应该是动词或动词短语,以描述函数执行的操作。
类方法的第一个参数应该命名为self,表示实例对象本身。
模块级函数应该使用简洁的、描述性的名字,避免使用单个字符的名称。
示例:
pythonCopy code# 函数名使用小写字母,单词之间用下划线分隔
def calculate_average(numbers_list):
total = sum(numbers_list)
return total / len(numbers_list)
方法名也遵循相同的规则
class Circle:
def calculate_area(self, radius):
return 3.14 * radius ** 2
类的命名
类的命名应该使用驼峰命名法,即每个单词的首字母大写,单词之间无下划线。
类的名称应该是名词或名词短语,以描述类的含义。
示例:
pythonCopy code# 使用驼峰命名法命名类
class BankAccount:
def init(self, balance):
self.balance = balance
def deposit(self, amount):
self.balance += amount
def withdraw(self, amount):
self.balance -= amount
变量的命名
变量的命名应该使用小写字母,单词之间用下划线分隔。大小写敏感。
变量的名称应该是名词或名词短语,以描述变量的含义。
常量应该全部大写,单词之间用下划线分隔。
示例:
pythonCopy code# 使用小写字母和下划线命名变量
total_price = 0
tax_rate = 0.05
#常量全部大写,单词之间用下划线分隔
MAX_RETRY_COUNT = 5
空格的使用
在二元操作符两侧应该留出一个空格。
在逗号、冒号、分号前不要加空格,而在它们后面应该加一个空格。
在函数的参数列表、索引和切片的左括号前不应有空格。
示例:
pythonCopy code# 二元操作符两侧应该留出一个空格
x = 10 + 2
#在逗号、冒号、分号前不要加空格,而在它们后面应该加一个空格
def calculate_sum(x, y):
return x + y
for i in range(10):
print(i)
#在函数的参数列表、索引和切片的左括号前不应有空格
result = calculate_sum(10, 20)
message = “hello world”[0:
代码缩进
缩进应该使用四个空格,而不是制表符。
所有代码块应该缩进,包括if语句、while语句、for循环等。
示例:
pythonCopy code# 使用四个空格进行缩进
def print_names(names_list):
for name in names_list:
if len(name) > 5:
print(name)
else:
print("Name is too short.")
# 所有代码块应该缩进
while True:
print("This is an infinite loop.")
文档字符串
每个函数、方法和类应该包含文档字符串,以解释它们的用途和行为。
文档字符串应该在函数、方法或类的定义行之后紧跟着。
文档字符串应该使用三个引号(“”")括起来,而不是两个单引号或双引号。
示例:
pythonCopy codedef calculate_sum(numbers_list):
"""
计算列表中所有数字的总和。
参数:
numbers_list:数字列表
返回值:
总和
"""
return sum(numbers_list)
导入
导入语句应该在文件顶部,位于模块注释和全局变量之后,函数和类定义之前。
每个导入应该独占一行。
导入语句应该按照标准顺序进行分组,每组之间应该用一个空行分隔。
示例:
pythonCopy code"""
这是一个演示模块
"""
import os
import sys
import numpy as np
import pandas as pd
from my_module import MyClass
这些是PEP 8中的一些重要规范和示例,但并不是全部。遵循这些规范可以使代码更易于阅读、理解和维护
2、pycharm中一键格式化代码:
根据Problems逐一修复
二、python 基本数据类型
1、变量
存储数据的载体,计算机系统中实际存在的数据,变量值可以被读取和修改
2、数字
常见数据类型: int-整形 float-小数
常用运算操作:
赋值=: a=1
加减乘除 ±/ :12=2
取余 % :11%2=2
乘方**:3**3=27
修改运算符():(1+4)/2=2
等于 == :返回布尔 1==1 True
不等于!=:
3、布尔boolean
True False
4、字符串string
\ 转义符
r 原字符,忽略转义
+字符串链接
索引 :str_a=“abcdef” str_a[0]=“a” 从0开始
切片 [:]:前闭后开
取中间2个 str_a[2:4]=“cd”
全部 str_a[:]=“abcdef”
倒序 str_a[-1:]=“f”
步长 start: stop: step 默认为1 str_a[0:5:2]=“ace”
三、python 字符串基本操作
1、字符串定义:
单行a=“x” 多行a=“”" xx"“”
2、常用特殊字符:
常见转义
\n 换行
\ 转义 \n
3、格式化
%s 格式化字符串
a=“神” print(“我是%s”%a)
%d 格式化整数
%f 格式化浮点数字
4、字面量插值
“str”.format()
#不指定位置,按默认顺序
a="{} {}".format("h","e") print(a)
#设置指定位置
a="{0} {1}".format("h","e")
print(a) b="{1} {0}".format("h","e")
print(b)
#通过名称传递变量
c="我的性别是{sex}".format(sex="男")
5、优雅的格式化
a="神" print(f"我是{a}")
6、常用api
#1、元素拼接join
hello a=["h","e","l","l","o"] print("".join(a))
#join将元素根据|拼接
h|e|l|l|o print("|".join(a))
#2、切分split
['my', 'name'] a="my name" print(a.split())
#3、替换replace
my name is b a="my name is a" print(a.replace("a","b"))
#4、取消首位空格strip=>my name a=" my name " print(a.strip())
四、python 运算符
#1、算术运算符
a,b=4,2
print(a+b) #加 6
print(a-b) #减 2
print(a*b) #乘 8
print(a/b) #除 2.0
print(a%b) #取模 0
print(a**b) #幂 16
print(a//b) #整除 2
b=3
print(a//b) #整除 向下取整1 4/3=1.33333=1
b=2.65
print(a//b) #整除 向下取整4/2.65=1.50943=1.0
#2、比较运算符
a,b=4,2
print(a==b) #等于 False
print(a!=b) #不等于 True
print(a>b) #大于 True
print(a<b) #小于 False
print(a>=b) #大于等于 False
print(a<=b) #小于等于 False
#3、赋值运算符
a=1 #简单赋值
print(a)
a,b=1,2 #多个变量赋值
print(a)
print(b)
a+=1
print(a) #加法赋值 自增 a=a+1 <==> a+=1 1+1=2
a-=1
print(a) #减法赋值 自减 2-1=1
a*=1
print(a) #乘法赋值 2*1=2
a/=1
print(a) #除法赋值 2/1=2
a%=1
print(a) #取模赋值 2/1=2 余数为0.0
a=2
a**=1
print(a) #幂赋值 2^1=2
a=2
a//=1
print(a) #整除赋值 2/1=2
#4、逻辑运算符 and or not
a,b=1,2
print(a==1 and b==2) #True
print(a==1 or b==2) #True
print(not a==1) #False
#5、成员运算符 in 、not in 右边是序列
a=[1,2,3]
b=1
print(b in a) #True
print(b not in a) #False
#6、身份运算符 is 、is not
a=[1,2,3]
b=[1,2,3]
print(a is b) #False 内存地址不一致
print(id(a))
print(id(b))
print(a is not b) #True
print(a==b) #True
7、is与==区别:is会判断内存地址相同 id(a)
#可变数据结构,内存地址不同
#不可变数据结构,内存地址相同
8、 运算符优先级
高到低口决:算位比 身成逻
【算术(±*/)、位(二进制)、比较(== > <)、身份(is /is not)、成员(in/not in)、逻辑(非与或)】
优先级:当多个运算符同时出现在一个表达式中时,先执行哪个运算符。
结合性:默认左,当一个表达式中出现多个优先级相同的运算符时,先执行哪个运算符:先执行左边的叫左结合性,先执行右边的叫右结合性
五、python 控制流-判断
1、什么是分支判断
2、if判断语句
3、else判断语句
4、elif 多重条件
if xx:
elif xx:
elif xx:
else:
xx
5、分支嵌套
if xx:
if xx:
else:
xx
else:
xx
6、三目运算符
h="变量1" if a>b else "变量2"
六、python 控制流-循环
1、什么是循环
2、for-in循环
使用场景:明确循环次数、或对容器进行迭代
range函数:
1) 传入一个参数,传入的是结束数值 前闭后开
range(101)产生0-100的整数序列
2)传入两个参数,传入的是开始、结束数值
range(1,100) 产生0-99的整数序列
3)传入三个参数,传入的是开始、结束数值、步长
range(0,101,2) 产生1到100的偶数序列 0 2 4…100
3、while循环
使用场景:满足条件时进入循环,需要设定结束条件,不然死循环
4、break 跳出整个循环
5、continue 跳出当前循环进入下一循环
6、pass 占位符
# 1、for in 循环
# 构造0-100的偶数序列
for i in range(0,101,2):
print(i)
# 2、while循环
count = 0
while count < 100:
count += 1
print(count)
if count == 3:
pass # pass占位
elif count == 9:
break # 跳出整个循环
else:
continue # 跳出当次,进入下一循环
# 3、练习
# 3-1、使用分支结构实现1~100之间的偶数求和
sum,end=0,100
for i in range(1,end+1):
if i%2==0:
sum+=i
else:
continue
print(sum)
#3-2、不使用分支结构实现1~100之间的偶数求和
sum,end=0,100
for i in range(0,end+1,2):
sum += i
print(sum)
"""猜数字游戏
计算机出一个1~100之间的随机数由人来猜
计算机根据人猜的数字分别
给出提示大一点/小一点/猜对了"""
while True:
computer_num = random.randint(1, 100)
people_num = int(input("请输入数字:"))
if people_num<computer_num:
print(f"电脑数字为:{computer_num}")
print(f"你的数字为:{people_num}")
print("大一点")
elif people_num>computer_num:
print(f"电脑数字为:{computer_num}")
print(f"你的数字为:{people_num}")
print("小一点")
else:
print(f"电脑数字为:{computer_num}")
print(f"你的数字为:{people_num}")
print("猜对了")
break
"""课后练习
奇数-不能被2整除的数
"""
#不使用分支结构实现1~100之间的奇数求和
sum=0
for i in range(1,100,2):
print(i)
sum+=i
print(f"1~100之间的奇数求和为:{sum}")
#使用while语句实现1~100之间的奇数求和
num,sum=0,0
while num<100:
num+=1
print(f"num:{num}")
if num%2 !=0:
sum+=num
print(f"sum:{sum}")
else:
continue
print(f"1~100之间的奇数求和为:{sum}")
七、 python 常用数据结构-列表
"""一、列表的定义
列表是有序的可变元素的集合,使用中括号[]包围,元素之间用逗号分隔
列表是动态的,可以随时扩展和收缩
列表是异构的,可以同时存放不同类型的对象
列表中允许出现重复元素"""
"""二、列表的使用:创建"""
#1.构造方法
list_a=list()
print(type(list_a),list_a)
#2、中括号填充元素
list_b=[1,"a",{"a":1},[1,2],(1,2,3)]
#3、列表推导式
list_c=[i for i in range(1,10)if i%2==0]
print(type(list_c),list_c)
"""三、列表的使用:索引/切片"""
#1、索引 (正索引,0开始;负索引,-1开始)
list_d=[1,2,3,4,5]
print(list_d[0]) #首个元素
print(list_d[-1]) #最后元素
#2、切片 获取多个元素
# [start:stop:step] 三种方式同前面rangestep-步长默认为1
#基本方法
li=['h','o','g','w','a','r','t','s']
print(li[0:5:2]) #第一个到第五个元素中按步长2 ['h', 'g', 'a']
print(li[2:4]) #第3个到第4个元素 'g', 'w']
print(li[:4]) #第1个到第4个元素 ['h', 'o', 'g', 'w']
print(li[2:]) #第3个到最后 ['g', 'w', 'a', 'r', 't', 's']
print(li[::2]) #全部元素,按步长2 ['h', 'g', 'a', 't']
print(li[::-1]) #全部元素,按步长2,倒序打印['s', 't', 'r', 'a', 'w', 'g', 'o', 'h']
"""三、列表的使用:运算符
重复:使用 * 运算符可以重复生成列表元素。
合并:使用 + 加号运算符,可以将两个列表合二为一。"""
# 1、* 重复生成列表元素
li1=[1]
print(li1*5) #[1, 1, 1, 1, 1]
# 2、+ 列表合并
li2=[1,2,3]
li3=[4,5,6]
print(li2+li3) #[1, 2, 3, 4, 5, 6]
"""四、列表的使用:成员检测
in:检查一个对象是否在列表中,如果在则返回 True,否则返回 False。
not in:检查一个列表是否不包含某个元素。如果不在返回 True,否则返回 False。"""
li1=[1,2,3]
print(1 in li1) #True
print(1 not in li1) #False
print(4 in li1) #False
print(4 not in li1) #True
"""五、列表方法"""
li=[1,2,3]
#扩展加元素
#1、append(item)
# 将一个对象item添加到列表末,入参-item,返回-None
li.append(4)
print(li) #[1, 2, 3, 4]
#2、extend(iterable)
# 将一个可迭代对象到所有元素,添加到列表末;入参-可迭代对象iterable;返回-None
li=[1,2,3]
li.extend('hello')
print(li) #[1, 2, 3, 'h', 'e', 'l', 'l', 'o']
li1=[1,2,3]
li2=[4,5,6]
li1.extend(li2) #[1, 2, 3, 4, 5, 6]
#3、insert(index,item)
# 将一个元素插入指定到索引位置;入参-索引值index和一个对象item;返回-None;原索引位置以及后面到元素后移一位
li=[1,2,3]
li.insert(1,"a")
print(li) #[1, 'a', 2, 3]
#缩小元素
#4、pop(index)
# 移除指定索引位置到元素;若索引值不正确则引发IndexError
# pop() 默认移除最后一个元素
li=[1,2,3]
li.pop(2)
print(li) #删除第三个元素,[1, 2]
li.pop() #删除最后元素,[1]
#2种异常情况
print(li)
li.pop(3) #IndexError: pop index out of range
li=[]
li.pop() #IndexError: pop from empty list
#5、remove(item)
# 移除列表第一个等于item的元素,入参-item,返回-None,目标元素必须存在,否则ValueError
li=[1,2,3]
li.remove(1) #[2, 3]
print(li)
li.remove(4) #ValueError: list.remove(x): x not in list
#排序
#6、sort(key=None,reverse=Flase)
#对列表进行原地排序,只使用<来进行元素比较
#入参:支持2个关键字
#key:指定带有一个参数的函数,用于从每个列表元素种提取比较键
#reverse:默认值为False表示升序,为True表示降序
#返回:None
#1)不传参数,默认升序,数字从小到大排序
li=[2,4,3,1]
li.sort()
print(li) #1, 2, 3, 4]
#2)指定key=len,按元素的长度排序
words=["python","go","java","c"]
words.sort(key=len)
print(words) #['c', 'go', 'java', 'python']
#3)指定reverse=True,降序
nums=[2,4,3,1]
nums.sort(reverse=True)
print(nums) #[4, 3, 2, 1]
#7、反转 reverse
"""reverse():将列表元素反转
参数:无
返回:None
反转只是针对索引值,元素间不互相比较"""
nums=[5,3,2,4,1]
nums.reverse()
print(nums) #[1, 4, 2, 3, 5]
"""六、列表嵌套
嵌套列表是指在列表里存放列表
列表的常用方法都适用于嵌套列表"""
#1、创建嵌套列表
list1=[[1,2,3],['a','b','c']]
print(type(list1)) #<class 'list'>
print(len(list1)) #2
#2、访问嵌套列表中的元素
print(list1[0][2]) #3
"""七、列表推导式
列表推导式是指循环创建列表,相当于 for 循环创建列表的简化版
语法:[x for x in li if x ...]"""
#实例:将1-10中所有的偶数开方后组成新的列表
#1、传统
result=[]
for e in range(1,11):
if e%2==0:
result.append(e**2)
print(result) #[4, 16, 36, 64, 100]
#2、列表推导式
result=[e**2 for e in range(1,11) if e%2==0 ]
print(result) #[4, 16, 36, 64, 100]
八、python 常用数据结构-元组
"""一、元祖定义:
元祖是有序的不可变对象的集合
元祖使用小括号(),各个对象之间使用逗号,分隔
元祖是异构的,可以包含多种数据类型"""
"""二、元祖的使用:创建"""
# 1、直接使用逗号分隔
tup1 = 1, 2, 3, 4
print(type(tup1), tup1)
# 2、通过小括号填充元素
tup2 = (1, 2, 3, 4)
print(type(tup2), tup2)
# 3、通过构造函数 要为空或者可迭代对象,否则TypeError: 'xx' object is not iterable
tup3 = tuple()
print(type(tup3), tup3) # 不传默认为()
tup4 = tuple('hello')
print(type(tup4), tup4) # 不传默认为()
tup5 = tuple([1, 2, 3, 4, 5])
print(type(tup5), tup5) # 不传默认为()
##异常
tup4 = tuple(1) # TypeError: 'int' object is not iterable
# 注意:单元素元祖,逗号不可缺少
tup6 = 1,
print(type(tup6), tup6) # <class 'tuple'> (1,)
tup7 = (2,)
print(type(tup7), tup7) # <class 'tuple'> (2,)
##不加逗号
tup7 = (2)
print(type(tup7), tup7) # <class 'int'> 2
"""三、元祖的使用:索引切片与列表一致"""
"""四、元祖的常用方法:"""
# 1、index
# index(item)
# 返回与目标元素相匹配的首个元素的索引
# 目标值必须在元祖中存在,否则会报错
li = 1, 2, 3
print(li.index(3)) # 2
print(li.index(4)) # ValueError: tuple.index(x): x not in tuple
# 2、conut
# index(item)
# 返回某个元素出现的次数
# 返回:次数
li = (1, 2, 3, 3, 3, 3)
print(li.count(3)) # 4
print(li.count(4)) # 如果输入不存在的对象则为0 0
"""五、元祖解包
把一个可迭代对象里的元素,一并赋值到由对应的变量组成的元祖中"""
# 1、传统逐一赋值 繁琐
t = (1, 2, 3)
a = t[0]
b = t[1]
c = t[2]
print(a, b, c)
# 2、使用元祖解包,一气呵成
a, b, c = [1, 2, 3]
print(a, b, c) # 1 2 3
a, b, c = (1, 2, 3)
print(a, b, c) # 1 2 3
"""六、元祖与列表的比较"""
"""
1、相同点:
1)都是有序的
2)都是异构的,能包含不同数据类型的对象
3)都支持索引和切片
2、区别:
1)声明方式不同,元祖使用(),列表使用[]
2)列表可变支持增删改,元祖不可变
"""
九、python 常用数据结构-集合
"""一、集合的定义
无序的唯一对象集合
用大括号{}包围,对象相互之间用逗号分割
集合是动态的,可以随时添加或者删除
集合是异构的,可以包含不同数据类型的数据"""
"""二、集合的使用:创建"""
#1、通过{}创建
set1={1,2,3}
print(type(set1),set1) #<class 'set'> {1, 2, 3}
#2、通过构造方法 set(interable)
set2=set("hello")
print(type(set2),set2) #<class 'set'> {'h', 'o', 'e', 'l'}
set3=set()
print(type(set3),set3) #<class 'set'> set()
#3、通过集合推导式
set4={i for i in range(5) if i%2==0}
print(type(set4),set4) #<class 'set'> {0, 2, 4}
"""集合的使用:成员检测in/not in"""
set1={1,2,3}
print(1 in set1) #True
print(1 not in set1) #False
print(4 in set1) #False
print(4 not in set1) #True
"""三、集合常用方法"""
#1、增 add(item)
##将单个对象添加到集合中,入参-item 返回-None
set1={1,2,3}
set1.add(4)
print(set1)
#2、update(iterable)
#批量添加来自可迭代对象中的所有元素
#入参:可迭代对象iterable
#返回:None
set1=set()
set1.update("hello")
print(type(set1),set1) #<class 'set'> {'e', 'l', 'o', 'h'}
set1.update([1,2,3])
print(type(set1),set1) #<class 'set'> {1, 2, 3, 'o', 'e', 'l', 'h'}
#3、删 remove(item)
#从集合中移除指定元素
#入参:指定元素值
#返回:None
#如果item不存在集合中则会引发KeyError
#元素存在
set1={1,2,"a"}
set1.remove("a") #{1, 2}
print(set1)
#元素不存在则报错
set1.remove(3) #KeyError: 3
#4、删 discard(item)
#从集合中移除指定对象item
#入参:指定对象值 返回-None,元素item不存在没影响,不会抛出KeyError
#1)元素存在
set1={1,2,"a"}
set1.discard("a") #{1, 2}
print(set1)
#2)元素不存在则报错
set1.discard(3) #返回空
#5、随机删 pop()
#随机从集合中移除并返回一个元素
#入参:无
#返回:被移除的元祖
#如果集合为空则会引发KeyError
#1)随机删除某个对象
set1={1,2,3,4,5}
item=set1.pop()
print(item,type(item),set1) #1 {2, 3, 4, 5}
#6、全部删 clear()
#清空所有元素
set1={1,2,3,4,5}
set1.clear()
print(set1) # set()
"""四、集合运算"""
#1、交集运算 itersection &
a={1,2,3}
b={4,3,6}
print(a.intersection(b)) #{3}
print(a&b) #{3}
#2、并集运算 union |
a={1,2,3}
b={4,3,6}
print(a.union(b)) #{1, 2, 3, 4, 6}
print(a|b) #{1, 2, 3, 4, 6}
#3、差集运算 difference -
a={1,2,3}
b={4,3,6}
print(a.difference(b)) #{1, 2}
print(a-b) #{1, 2}
print(b.difference(a)) #{4, 6}
print(b-a) #{4, 6}
"""五、集合推导式
语法:{x for x in ...if...}
"""
#寻找共同abc与bcd的字母
#1、传统
set1=set()
for s in 'abc':
if s in 'bcd':
set1.add(s)
print(set1) #{'b', 'c'}
#2、简洁
set1={s for s in 'abc'if s in 'bcd'}
print(set1) #{'b', 'c'}
十、python 常用数据结构-字典
# -*- coding: utf-8 -*-
# @Time : 2023/4/23 19:13
# @Author : yanfa
# @user : yanfa
# @File : dict_.py
# @remark: 字典
""""""
"""一、字典的定义
字典是无序的键值对集合
字典用大括号{}包围
每个键值对之间用逗号(,)分隔
每个键和值用冒号(:)分隔
字典的动态的"""
"""二、字典的创建"""
#第一种:使用大括号{}
dic1={}
dic2={"a":1,"b":[1,2]}
#第二种:构造方法
dic3=dict()
dic4=dict([("a",1),("b",2)]) #{'a': 1, 'b': 2}
print(dic4)
#第三种,推导式
dic_5={k:v for k,v in [("a",1),("b",2)]}
"""三、字典的使用:访问元素
支持括号记法[key]
字典使用键来访问其关联的值
访问时对应的key必须要存在"""
dic_6={"a":1,"b":[1,2]}
#1、访问存在的key
print(dic_6["a"]) #1
#2、访问不存在的key
# print(dic_6["c"]) #KeyError: 'c'
"""三、字典的使用:操作元素
语法:dict[key]=value
添加元素-键不存在:
修改元素-键存在"""
#1、添加元素
dic_6["c"]=2
print(dic_6) #{'a': 1, 'b': [1, 2], 'c': 2}
#2、修改元素
dic_6["c"]=3
print(dic_6) #{'a': 1, 'b': [1, 2], 'c': 3}
"""四、字典使用:嵌套字典
字典的值也可以是字典对象"""
dic_6={"a":{"b":1}}
print(dic_6["a"]["b"]) #1
"""五、字典方法"""
dic_7={"a":1,"b":[1,2]}
#1、keys(),# 返回视图对象,通过list()将视图转成列表
print(dic_7.keys()) #dict_keys(['a', 'b'])
print(list(dic_7.keys())) #['a', 'b']
#2、values()
print(dic_7.values()) #dict_values([1, [1, 2]])
print(list(dic_7.values())) #[1, [1, 2]]
#3、items()
print(dic_7.items()) #dict_items([('a', 1), ('b', [1, 2])])
print(list(dic_7.items())) #[('a', 1), ('b', [1, 2])]
#4、get() 找不到不报错,返回None。方法的好处是无需担心 key 是否存在,永远都不会引发 KeyError 错误
dic_8={"a":1,"b":2,"c":3}
print(dic_8.get("a")) #1
print(dic_8.get("d")) #None
#5、update,使用来自 dict 的键/值对更新字典,覆盖原有的键和值。
dic_9={"a":1,"b":2,"c":3}
data={"b":20,"d":4}
dic_9.update(data)
print(dic_9) #{'a': 1, 'b': 20, 'c': 3, 'd': 4}
#6、pop() 删除指定 key 的键值对,并返回对应 value 值。
dic_10={"a":1,"b":2,"c":3}
print(dic_10.pop("a")) #如果 key 存在于字典中,则将其移除并返回 value 值 1
print(dic_10.pop("d")) #如果 key 不存在于字典中,则会引发 KeyError。
#7、clear() 清空元素
dic_11={"a":1,"b":2,"c":3}
dic_11.clear()
print(dic_11) #{}
#8、copy() 拷贝
dic_12={"a":1,"b":2,"c":3}
dic_13=dic_12.copy() #{'a': 1, 'b': 2, 'c': 3}
print(dic_13)
"""六、字典推导式
可以从任何以键值对作为元素的可迭代对象中构建出字典"""
#例子1 给定一个字典对象{'a': 1, 'b': 2, 'c': 3},找出其中所有大于 1 的键值对,同时 value 值进行平方运算
dic_11={k:v for k,v in[("a","b","c"),(1,2,3)]}
print(dic_11)
#例子2 将大于1的值平方返回一个新字典
dic_12={"a":1,"b":2,"c":3}
dic_13={k:v**2 for k,v in dic_12.items() if v>1}
print(dic_13) #{'b': 4, 'c': 9}
#例子3 将键换成值
dic_14={"a":1,"b":2,"c":3}
dic_15={v:k for k,v in dic_14.items()}
print(dic_15) #{1: 'a', 2: 'b', 3: 'c'}
十一、python 函数
"""一、函数的作用
函数是组织好的,可重复使用的,用来实现单一或者相关联功能的代码段
函数能提高应用的模块性和代码的重复利用率
python内置函数:https://docs.python.org/zh-cn/3.8/library/functions.html"""
"""二、函数的定义
def:函数关键字
function_name:函数名称
parameter_list:可选,指定向函数的参数
def function_name([parameter_list]):
['''xxx''']
[function_body]
注意缩进:python通过严格的缩进来判断代码块
函数体和注释相对def关键字保持一定的缩进,一般4个空格"""
def fun_a(a,b,c):
"""这是一个函数"""
print(f"传入的参数为{a}{b}{c}")
#打印函数comments内容
print(fun_a.__doc__) #这是一个函数
help(fun_a)
#定义空函数
#1、comments
def fun_demo1():
"""这是一个函数"""
#2、pass占位
def fun_demo2():
pass
"""三、函数调用"""
#无参数
def fun_demo3():
"""函数"""
print("这是函数")
fun_demo3() #这是函数
#有参数
def fun_demo4(a,b,c):
"""这是一个函数"""
print(f"传入的参数为{a}{b}{c}")
fun_demo4(1,2,3) #传入的参数为123
"""四、函数传递
形式参数:定义函数时,函数名称后面括号中的参数 abc
实际参数:调用函数时,函数名称后面括号中的参数 123"""
"""五、位置函数
数量必须与定义一致
位置必须与定义一致"""
#1、错误例子-数量错误
fun_demo4(1,2) #TypeError: fun_demo4() missing 1 required positional argument: 'c'
fun_demo4(1,2,3,4) #TypeError: fun_demo4() takes 3 positional arguments but 4 were given
#2、错误例子-位置传错
def person(name,age):
print(f"姓名为:{name}")
if age>=18:
print(f"{name}已成年")
person(20,"yanfa") #TypeError: '>=' not supported between instances of 'str' and 'int'
person("yanfa",20) #姓名为:yanfa yanfa已成年
"""六、关键字参数
使用形式参数的名字确定输入的参数值
不需要与形式参数的位置完全一致"""
def fun_demo4(a,b,c):
"""这是一个函数"""
print(f"传入的参数为{a}{b}{c}")
fun_demo4(a=1,c=3,b=2) #传入的参数为123
"""七、为参数设置默认值
定义函数时可以指定形式参数的默认值,需要是不可变对象如数字/字符串/元祖,否则默认值会随着调用发生变化
指定默认值的形式参数必须放在所有参数的最后,否则会产生语法错误
param=default_value:可选,指定参数并且为该函数设置默认值为default_value
def function_name(...,[param=default_value]
[function_body]"""
#1、不传参数
def fun_1(b=0):
print(f"传入参数为:{b}")
fun_1() #传入参数为:0
#2、错误示例-默认值不放最后
def fun_2(a,b=1,c):
print(f"传入参数为:{b}")
#3、错误示例,默认值为空列表
#需要是不可变对象如数字/字符串/元祖,否则默认值会随着调用发生变化
def fun_3(a,b,c=[]):
c.append(a)
c.append(b)
print(f"传入参数为:{a} {b} {c}")
fun_3(1,2) #传入参数为:1 2 [1, 2]
fun_3(3,4) #传入参数为:3 4 [1, 2, 3, 4]
"""函数返回值
return [value]
"""
#1、不传值则返回None
def sum(a,b):
result=a+b
return
res=sum(1,2)
print(res) #None
#2、返回一个值
def sum(a,b):
result=a+b
return result
res=sum(1,2)
print(res) #3
#3、返回多个值,用逗号分隔,作为元祖
def sum(a,b):
result=a+b
return result,a,b
res=sum(1,2)
print(res) #(3, 1, 2)
print(type(res)) #<class 'tuple'>
十二、python 函数进阶与参数处理
# @remark: 函数进阶与参数处理
""""""
"""一、可变参数
可变参数也称为不定长参数
传入参数中实际参数可以是任意多个
常用形式:*args **kwargs"""
"""*args
接受任意多个实际参数,并将其放入一个元祖中
使用已经存在的列表或元祖作为函数的可变参数,可以在列表名称前加*
传参是*是组合参数为元祖
调用时*是解包"""
def print_language(*args):
print(args)
#1、调用函数,把不同数量的参数传递进去,用位置函数
print_language("python","go") #存放到一个元祖('python', 'go')
print_language("python","go","java","php") #('python', 'go', 'java', 'php')
#2、等价为print_language("python","go","java","php")
lan=["python","go","java","php"]
# print_language(lan)
print_language(*lan) #('python', 'go', 'java', 'php')
"""**kwargs
接受任意多个类似关键字参数一样显示赋值的实际参数,并将其放到一个字典中
使用已经存在字典作为函数的可变参数,可以在字典的名称前面加**
**-打包的作用
调用时参数前面**表示解包"""
#1、打包
def print_info(**kwargs):
print(kwargs)
print_info(a=18,b=20) #{'a': 18, 'b': 20}
#2、解包 等价于print_info(a=18,b=20)
params={"a":18,"b":20}
print_info(**params) #解包 {'a': 18, 'b': 20}
十三、python lambda表达式
# @remark:匿名函数 lambda
""""""
import math
"""一、匿名函数
没有名字的函数
用lambda表达式创建匿名函数"""
"""二、使用场景
需要一个函数,但是又不想费神去命名这个函数
通常在这个函数只使用一次的场景下
可以指定短小的回调函数"""
"""三、语法
result:调用lambda表达式
[arg1[,arg2,...,argn]]:可选,指定要传递的参数列表
expression:必选,指定一个实现具体功能的表达式
result=lambda[arg1[,arg2,...,argn]]:expression"""
#1、实例-求圆面积
#常规写法
# def area(r):
# '''计算园面积 r-半径'''
# result=math.pi*r*r
# return result
# print(area(10))
#lambda表达式
r=10
result=lambda r:math.pi*r*r
print(result(r)) #314.1592653589793
#不可省略自己的变量,异常-如果不指定r
result=lambda r:math.pi*r*r
print(result) #<function <lambda> at 0x103ee9d30>
#示例2:对获取到的信息进行排序
book_info=[("python入门",22.5),("java入门",20),("测试入门",25)]
print(book_info) #
# 指定规则排序 lambda x:(x[1])-返回列表中每个元祖的第二个元素
book_info.sort(key=lambda x:(x[1]))
print(book_info) #[('java入门', 20), ('python入门', 22.5), ('测试入门', 25)]
十四、python 面向对象概念
# @remark:面向对象概念
""""""
"""一、面向对象是什么
python是一门面向对象的语言
面向对象编程oop:object oriented Programming
所谓的面向对象,就是在编程的时候尽可能的去模拟真实的现实世界,按照现实世界中的逻辑去处理问题
,分析问题中参与其中的有哪些实体,这些实体应该有什么属性和方法,我们如何通过调用这些实体的
属性和方法去解决问题。
"""
"""二、两种编程思想
面向过程:
一种以过程为中心的编程思想
首先分析解决问题所需要的步骤
然后用函数将这些步骤一步一步的实现
最后按顺序依次调用执行
面向对象:
是一种更符合我们人类思维习惯的编程思想
面向对象开发是不断创建对象,使用对象,操作对象做事
可以将复杂的事情简单化"""
"""三、类与对象
类:class 用来描述具有相同属性和方法的对象的集合。它定义了集合中每个对象共有的属性和方法
对象:object 也成为示例,是一个具体存在的实体 静态-属性(头发) 动态-行为(吃饭)"""
十五、python 类和对象
# @remark:类与对象
""""""
"""一、类的定义
class 关键字
class 类名(父类名):
'''类的帮组信息'''
属性:类中方法外定义的变量,名称或形容词,实例的状态或者数据
方法:类体中定义的函数,与函数一致,可以有参数列表和返回值。动词
"""
#1、实例
#类的声明 不传则默认父类是超类object
class Human:
"""人类"""
#定义属性(类属性)
message="这是类属性"
#构造方法 -自动执行,直接返回该类的实例,如果不行则默认创建一个构造方法
def __init__(self,name,age):
# 实例属性(变量)
self.name=name #通过self绑定到自身
self.age=age
print("这是构造方法")
print(Human.message) #这是类属性
"""二、类的方法
1)实例方法
-构造方法
2)类方法
3)静态方法"""
"""三、构造方法与实例化
作用:实例化对象
语法:def __init__(self,参数列表)
访问:类名(参数列表)"""
#实例化对象
person=Human("yanfa",18) #这是构造方法
#通过实例访问类属性
print(person.message) #这是类属性
#通过实例访问实例属性
print(person.name) #yanfa
print(person.age) #18
"""四、实例方法
作用:提供每个类的实例共享的方法
语法:def 方法名(self,参数列表)
访问:实例.方法名(参数列表)"""
# @remark:实例方法
class Human:
# 实例方法
def study(self,course):
print(f"正在学习{course}")
person=Human()
person.study("python") #正在学习python
"""五、类方法
作用:可以操作类的详细信息,不需要实例化
语法:@classmethod
访问:类名.类方法名(参数列表)"""
# @remark:类方法
class Human:
# 类属性
pop = 0
# 类方法 可以操作类的详细信息
@classmethod # 只能用这个装饰器
def born(cls): # cls是class的简写,是指类名本身
print("这是类方法")
cls.pop += 1
# 通过类名访问类方法
Human.born() # 这是类方法
print(Human.pop) # 1
"""六、静态方法
作用:不需要实例化对象
语法:@staticmethod
访问:类名.静态方法名()"""
# @remark:静态方法
class Human:
# 定义静态方法
@staticmethod
def grow_up():
print("这是静态方法")
#访问静态方法
Human.grow_up() #这是静态方法