Python基础

1 基础部分

1.1 语言常见分类

  • 编译型和解释型
  • 静态型和动态型
  • 强类型和弱类型

1.2 编译与解释

(1)编译
特点:把程序源代码都编译成机器语言(二进制),保存为二进制文件(一次全部编译后运行)
优点:计算机可以直接运行,执行速度快
缺点:跨平台性较差
编译型语言:C、C++、Swift、Java、Go等

(2)解释
特点:在程序执行时才会一行一行地处理成机器语言(解释一行执行一行)
优点:跨平台性好
缺点:执行速度慢
解释型语言:Javascript、Python、PHP、Ruby等
运行需要解释器

(3)编译与解释的本质
计算机本身只能识别机器语言

1.3 计算机组成

(1)硬件系统
1)中央处理器(CPU):计算数据和分配执行任务
2)存储器:
内存:临时存储数据,执行速度快,断电后数据丢失
外存:永久存储数据,断电后数据不会丢失,执行速度慢
3)输入设备:提供计算数据(键盘、鼠标、扫描仪、麦克风、摄像头等)
4)输出设备:显示最终计算结果(打印机、显示器等)

(2)软件系统
1)系统软件(Windows、Linux、macOS等)
2)应用软件(QQ、微信等)

1.4 程序执行原理

在这里插入图片描述
没有运行的程序保存在硬盘上,运行后被操作系统加载到内存中(变为进程)等待CPU的调度执行,CPU执行内存中加载的程序代码,完成计算输出结果

1.5 Python代码注释

作用:增加代码可读性
单行注释:# 一次只注释一行 , 快捷键:ctrl + /
块注释:””” 一次注释多行 “““ 或 ’’’ 一次注释多行 ‘‘‘

1.6 Python变量

变量:为快速定位目标数据,将数据在内存空间占据的空间分配的一个名称
定义:变量名 = 数据值 ,变量名要满足 标识符命名规则;
作用:临时存储数据

1.7 标识符命名

(1)标识符命名规则:
1)由数字、字母、下划线组成
2)不能使用数字开头
3)不能使用关键字
4)严格区分大小写
不能使用中文定义变量名

(2)命名习惯:
1)大驼峰: MyName
2)小驼峰: myName
3)下划线: my_name

1.8 Python关键字

1)关键字:具有特殊含义和功能的标识符
2)查看Python的所有关键字:
step1:导入工具包:import keyword
step2: 使用工具包中的工具:keyword.kwlist
3)可以直接使用关键字,但不能对关键字赋值

1.9 输出

(1)作用: 将程序运行结果输出打印到屏幕或终端
(2)格式化输出: 按照一定格式输出内容

  • 1)常见的格式化符号:
    a. %06d, 表示输出的整数显示位数, 不足位以0补全, 超出当前位数则原样输出
    b. %.2f, 表示小数点后显示的小数位数, 此为保留2位小数
    c. 任何类型的数据都可转换为字符串类型,故%d,%f在print输出语句中,可替换为%s

  • 2)格式化字符串:
    a. %s,print(“我的名字是:%s,明年%d岁” % (name,age+1)
    b. f’{表达式}',print(f"我的名字是{name},明年{age+1}岁")
    c. 转义字符:
        换行:\n
        Tab键:\t
    d. 结束符:
        print(“输出的内容”, end=“\n”)
        在Python中, print(), 默认⾃ 带 end=“\n” 这个换⾏结束符

1.10 输入

(1)作用: 程序用来接收⽤户输⼊的数据
(2)语法: input(“提⽰信息”)
(3)特点:
1)input接收到用户信息,一般保存在变量中以便使用
2) input会把用户输入的任何类型的数据都当作字符串处理

1.11 运算符

(1)作用:
1)计算机可以完成多种类型的运算
2)不同类型的运算需要依赖不同的符号
3)运算符让计算机认识并处理对应的计算逻辑

(2)分类:

1)算数运算符:

  • +:加
  • -:减
  • * :乘:可以用于字符串计算,如:print(“n” * 5),输出为:nnnnn
  • / :除
  • %:取余
  • // :求商
  • **:幂

2)比较运算符: 条件成立返回True,不成立返回False

  • ==
  • !=
  • >
  • >=
  • <
  • <=

3)逻辑运算符:
- and:两者都为真返回True,否则返回False
- or:一者为真即返回True,两者全假返回False
- not:取反操作,若为True,取反之后为False

4)赋值运算符:将运算符右侧的值, 赋值给左侧容器

  • =
  • +=:a + = b 等价于 a = a + b
  • -=:a - = b 等价于 a = a - b
  • *=:a *= b 等价于 a = a * b
  • /=:a / = b 等价于 a = a / b
  • %=:a % = b 等价于 a = a % b
  • //=:a // = b 等价于 a = a // b
  • **=:a ** = b 等价于 a = a ** b

(3)运算符优先级
1)按分类比较:
a. 算术运算符【由高至低】

  • ()
  • ** 幂等
  • * / // % 按书写顺序
  • + -

b. 逻辑运算符【由高至低】

  • ()
  • not
  • and
  • or

2)按类型比较【由高至低】

  • **:幂
  • *、/、%、//:乘、除、取余、求商
  • +、-:加、减
  • <=、>=、>、<:
  • ==、!=:
  • =、%=、*=、/=、//=、+=、-=、**=:赋值运算符
  • not、and、or:逻辑运算符

1.12 数据类型

计算机工作的过程就是完成不同类型的计算,如:数学运算、文件存储、逻辑判断等,数据类型可对不同数据进行分类管理和标识,可通过 type() 函数返回当前变量或数据所属类型,type(数据) 或 type(变量名)。

数据类型分类:

  • 整型,int,如:1
  • 浮点型,float,如:4.6
  • 布尔型,bool,如:True
  • 字符串型,str,如:‘12345’
  • 列表,list,如:[1,2,3,4,5]
  • 元祖,tuple,如:(1,2,3,4,5)
  • 集合,set,如:{1,2,3,4,5}
  • 字典,dict,如:{‘name’:‘zhangsan’,‘age’:14}

2 数据类型

2.1 字典

2.1.1 定义

dict = {"键名1":"键值1","键名2":"键值2"......"键名n":"键值n"}

  • 键必须是唯一的,创建时如果同一个键被赋值两次,后一个值会被记住
  • 值可以取任何数据类型,但键必须是不可变类型

2.1.2 作用

在处理复杂业务,需要使用到不同类型的数据,通过字典在保存时对这些不同类型的数据加以区分;字典可以保存多个数据,且能给这些数据“起名字”以便区分。

2.1.3 常用操作及方法

(1)新增
字典名['键名'] = 新增键值
在字典中增加对应的键值对

(2)删除
1)del: del["具体键名"] 或 del 字典名
前者删除具体值,后者删除整个字典

2)clear: 字典.clear()
清空字典数据

(3)修改
字典名['键名'] = 键值
如果被修改的键名存在,直接用新值替换旧值;若不存在则新增

(4)查找
1)通过键名查找: 字典名["键名"]
通过键名查找对应的值,若键名不存在抛出异常
2)get: 字典名.get(key, default=None)
key: 字典中要查找的键。
default :如果指定的键不存在时,返回该默认值

(5)其他方法
1)keys: 字典名.keys()
返回字典所有的键名,存放于列表中

2)values: 字典名.values()
返回字典对应的值,存放于列表中

3) items: 字典名.items()
将字典的每一个键值对都处理成元组, 存放于一个列表中

2.1.4 遍历字典

使用for循环遍历键名,for key in 字典.keys()

2.2 字符串

2.2.1 定义

(1)单引号字符串,如:‘单引号’
(2)双引号字符串,如:“双引号”
(3)三引号字符串,如:“”“三引号”“” 或 ```三引号```
(4)特殊符号处理,如: "I\'m zhangsan“,输出:I’m zhangsan
(5)去除特殊字符功能, 如: r"I\'m zhangsan“,输出:I\'m zhangsan

2.2.2 下标访问

字符串名[下标值], 下标从0开始

2.2.3 字符串切片(列表和元祖也可进行切片操作)

字符串名[开始位置下标:结束位置下标:步⻓]
开始位置下标: 从0开始
结束位置下标:下标对应的字符不会被截取到
步长:设置截取间隔,默认为1,正负表示方向

```
 str = 'abcdefg'
 print(str[1:3:1])   # 输出:bc
 print(str[1:3)   # 输出:bc
 print(str[:3])    # 输出:abc
 print(str[1:])    # 输出:bcdefg
 print(str[:])    # 输出:abcdefg
 print(str[::2])    # 输出:aceg
 print(str[:-1])    # 输出:abcdef
 print(str[-3:-1])    # 输出:ef
 print(str[::-1])    # 输出:gfedcba
```

2.2.4 常用操作及方法

(1)查找
1)find(): 字符串.find(被查找字符,开始位置,结束位置)
省略开始位置和结束位置表示从头寻找至尾
若被查找字符存在,则返回第一次出现位置的下标;若不存在返回 -1

2)rfind(): 字符串.rfind(被查找字符,开始位置,结束位置)
同find(),不过从右侧开始查找

3)index(): 字符串.index(被查找字符,开始位置, 结束位置)
省略开始位置和结束位置表示从头寻找至尾
若被查找字符存在,则返回第一次出现位置的下标;若不存在抛出异常

4)rindex(): 字符串.index(被查找字符,开始位置, 结束位置
同index(),不过从右侧开始查找

5)count(): 字符串.count(被测试字符, 开始位置,结束位置)
省略开始位置和结束位置表示从头寻找至尾
统计被测字符出现的次数

6) len(): len(字符串)
返回字符串长度

(2)替换
replace(): 字符串.replace(原字符串, 替换字符串, 替换次数)
使用替换字符串, 按规则替换旧的字符串内容
字符串属于不可变数据类型,修改不会影响原来的空间

(3)判断
1) startswith(): 字符串.startswith(字符, 开始位置,结束位置)
判断目标字符串是否以 XXX 开

2) endswith(): 字符串.startswith(字符, 开始位置,结束位置)
判断目标字符串是否以 XXX 结尾

3)isspace(): 字符串.isspace()
判断字符串中是否包含空格,若包含空格则返回 True

4)isalnum(): 字符串.isalnum()
如果字符串中⾄少有⼀个字符并且所有字符都是字⺟或数字则返回 True

5) isalpha(): 字符串.isalpha()
如字符串⾄少有⼀个字符并且所有字符都是字⺟则返回 True

6) isdecimal(): 字符串.isdecimal()
如果字符串中只包含十进制字符则返回 True。这种方法只存在于unicode对象(unicode数字、全角数字),若为byte数字将抛出异常’bytes’ object has no attribute ‘isdecimal’。
定义一个十进制字符串,只需要在字符串前添加 ‘u’ 前缀

7) isdigit(): 字符串.isdigit()
如果字符串中只包含数字则返回 True(Unicode数字、byte数字(单字节)、全角数字(双字节)、罗马数字)

8)isnumeric(): 字符串.isnumeric()
字符串是否只由数字组成,只针对unicode对象(Unicode数字,全角数字(双字节),罗马数字,汉字数字),若为byte数字将抛出异常

num = "1"  #unicode
num.isdigit()   # True
num.isdecimal() # True
num.isnumeric() # True

num = "1" # 全角
num.isdigit()   # True
num.isdecimal() # True
num.isnumeric() # True

num = b"1" # byte
num.isdigit()   # True
num.isdecimal() # AttributeError 'bytes' object has no attribute 'isdecimal'
num.isnumeric() # AttributeError 'bytes' object has no attribute 'isnumeric'

num = "IV" # 罗马数字
num.isdigit()   # True
num.isdecimal() # False
num.isnumeric() # True

num = "四" # 汉字
num.isdigit()   # False
num.isdecimal() # False
num.isnumeric() # True

9)istitle() : 字符串.istitle()
如果字符串是标题化的(每个单词的⾸字⺟⼤写),则返回 True

10) islower(): 字符串.islower()
如果字符串由小写字母组成,则返回true

11) isupper() : 字符串.isupper()
如果字符串由大写字母组成,则返回true

(4) dir( )函数: 查看某类型中定义的⽅法
dir( str ) 显示字符串的所有⽅法

(5)大小写转换
1)capitalize() : 字符串.capitalize()
把字符串的第⼀个字符⼤写

2)title(): 字符串.title()
把字符串的每个单词⾸字⺟⼤写

3) lower(): 字符串.lower()
将所有⼤写字符转换为⼩写

4) upper(): 字符串.upper()
将所有小写字符转换为大写

5)swapcase(): 字符串.swapcase()
字符串中大写转小写,小写转大写

(6)拆分和连接
1)partition(): 字符串.partition(字符串)
把字符串分成⼀个 3 元素的元组 (字符串前⾯部分, 字符串, 字符串后⾯部分)

2) split(): 字符串.split(分割符, num)
按制定字符分割字符串
num 为具体数值, 当分割符存在多次时, 可以设定使用几次
若不传入分隔符,默认以空格为分割

   str = "hello  Python or hello world or hello  hello"
   print(str.split("or"))  # 输出:['hello Python','hello world','hello hello']
   print(str.split("or",1))   # 输出:['hello Python','hello world or hello hello']
   print(str.split("",2))  # 输出:['hello' ,'Python','hello world or hello hello']
   print(str.split(""))  # 输出:['hello' ,'Python','or ','hello','world','or','hello','hello']

3)splitlines(): 字符串.splitlines()
按照⾏(‘\r’, ‘\n’, ‘\r\n’)分隔, 返回⼀个包含各⾏作为元素的列表

4)join(): 字符串.join(列表)
将列表按指定字符合并为字符串

    list = ['hello' ,'Python','or ','hello','world','or','hello','hello']
    print("-".join(list))  # 输出:hello-Python-or-hello-world-or-hello-hello

(7) 去除空⽩字符
1) lstrip(): 字符串.lstrip()
去除字符串左边(开始) 的空⽩字符

2)rstrip(): 字符串.rstrip()
去除字符串右边(末尾) 的空⽩字符

3)strip(): 字符串.strip()
去除字符串两边 的空⽩字符

(8)⽂本对齐
1) ljust(): 字符串.ljust(len)
返回⼀个原字符串左对⻬,并使⽤空格填充⾄⻓度len的新字符串

2) rjust(): 字符串.rjust(len)
返回⼀个原字符串右对⻬,并使⽤空格填充⾄⻓度len的新字符串

3) center(): 字符串.center(len)
返回⼀个原字符串居中对⻬,并使⽤空格填充⾄⻓度len的新字符串

2.3 元祖

2.3.1.定义

(1)tuple1 = (值1,值2,值3…值n)
(2)tuple2 = (值,) ,如果元祖中只有一个数值,也需要加逗号,否则会影响数据类型
(3)tuple3 = tuple(),实例化元祖

2.3.2 作用

用于存储多个数据,且这些数据不会被修改。

2.3.3 常用操作及方法

  • 下标查找: 元祖[下标]
    返回下标对应的元素
  • index: 元祖.index(具体元素)
    返回某个元素对应的下标,未找到抛出异常
  • count: 元祖.count(具体元素)
    返回某个元素出现的次数
  • len: len(元祖)
    • 返回元祖的长度

2.4 列表

2.4.1 定义

(1)list = [值1,值2,值3…值n]
(2)实例化:list = list()

2.4.2 作用

单个数据存放在变量中,多个变量组成的⼤量数据就可以存放在列表中,列表⽤于存放多个数据,列表是可变数据类型

2.4.3 常用操作及方法

(1)增加

  • append: 列表.append(被添加数据)
    将被添加数据添加在列表的末尾
list = ["hello","Python","Java","HTML"]
list.append("CSS")
print(list)  # 输出:['hello','Python','Java','HTML','CSS']
  • extend: 列表.extend(被添加数据)
    若被添加的数据是可变类型,则将其中的值一一加入列表;若被添加的数据是不可变类型,则打散加入
list = ["hello","Python","Java","HTML"]
# 添加可变类型数据至列表
list.extend(["CSS","C++"])
print(list)  # 输出:['hello','Python','Java','HTML','CSS','C++']
# 添加不可变类型
list.extend("JS")
print(list)  # 输出:['hello','Python','Java','HTML','CSS','C++','J','S']
  • insert: 列表.insert(指定位置, 数据)
    在指定位置插入新数据
list = ["hello","Python","Java","HTML"]
list.insert(1,"CSS")
print(list)  #输出:['hello',‘CSS’,'Python','Java','HTML']

(2)删除

  • del: del 具体数值
    del 可以删除列表中的一个值, 或者整个列表,也可以删除其它数据类型
list = ["hello","Python","Java","HTML"]
# 删除单个数据
 del list[0]
 print(list)  # 输出:[‘CSS’,'Python','Java','HTML']
# 删除列表
del list  
print(list)  # list is not defined 
  • pop: 列表.pop(下标)
    删除指定下标的数据(下标不写默认为0), 并且返回被删除数据
list = ["hello","Python","Java","HTML"]
val = list.pop(1)
print(val)  输出:Python
print(list)  输出:['hello','Java','HTML']
  • remove: 列表.remove(数据)
    在列表中删除第一个被匹配到的数据(不会返回被删除的值,如果被删除的数据有多个,仅删除第一次出现的数据)
list = ["hello","Python","Java","HTML","hello"]
list.remove("hello")
print(list)  输出:['Python','Java','HTML','hello']
  • clear: 列表.clear()
    清空列表
list = ["hello","Python","Java","HTML","hello"]
list.clear()
print(list)  输出:None []

(3)修改

  • 下标修改: 列表[下标] = 修改后的值
  • reverse: 列表.reverse()
    倒置列表,返回None
  • sort: 列表.sort(key=None, reverse=False)
    将列表按指定规则进行排序
    • key:主要是用来进行比较的元素,只有一个参数,具体的函数的参数就是取自于可迭代对象中,指定可迭代对象中的一个元素来进行排序。
    • reverse:排序规则,reverse = True 降序, reverse = False 升序(默认)
# 通过指定列表中的元素排序来输出列表
# 获取列表的第二个元素
def takeSecond(elem):
    return elem[1]
# 列表
random = [(2, 2), (3, 4), (4, 1), (1, 3)]
# 指定第二个元素排序
random.sort(key=takeSecond)
print (random)   # 输出:[(4, 1), (2, 2), (1, 3), (3, 4)]
       
# 降序输出
list = [2,3,5,7,1,0]
list.sort(reverse = True)
print(list)  输出:[7,5,3,2,1,0]

(4)查询

  • 通过下标查询: 列表[下标]
  • index: 列表.index(被查字符)
    查找目标数据, 返回指定下标
  • count: 列表.count(数据)
    统计被测试值出现的次数
  • len: len(列表)
    统计当前列表元素个数

(5)复制

  • copy: 列表.copy()

(6)列表遍历

  • 使用while
list = [1,3,5,6,7,22]
i = 0
while(i < len(list)):
    print(list[i])
    i += 1
  • 使用for
list = [1, 3, 5, 6, 7, 22]
for item in list:
    print(item)

3 基本控制结构

3.1 判断结构

3.1.1 if语句

语法:

if 要判断的条件:
 	条件成⽴时执行的代码
     ……
else:
     条件不成⽴时执行的代码
     ……

3.1.2 elif多重判断

语法:

    if 条件1:
    	条件1满⾜执⾏的代码
    	……
	elif 条件2:
    	条件2满⾜时执⾏的代码
    	……
	elif 条件3:
    	条件3满⾜时执⾏的代码
    	……
	else:
    	以上条件都不满⾜时执⾏的代码
    ……

3.1.3 if嵌套

语法:

    if 条件1:
    	条件1满⾜时执⾏的代码
    	……
    	if 满足条件1基础上的条件2:
        	条件2满足时执行的代码
        	……
    	else:
	    	条件2不满足时执行的代码
	else:
	    条件1不满⾜时执⾏的代码
	……

3.2 循环结构

3.2.1 for循环

  • 常用场景:
    (1)让指定的代码重复执行
    (2)遍历容器中的数据,逐个取出
  • 语法:
    for 变量 in 容器:
        重复执⾏的代码
    

3.2.2 while循环

  • 常用场景: 让执行的代码按照指定的次数重复执行
  • 语法:
   定义计数器
   while 条件:
   	条件满⾜时执行的代码
   	计数器 + 1

循环结束后, 之前定义的计数器的数值是依旧存在的

  • 举个🌰:打印九九乘法表
    i = 1
    while i <= 9:
    	j = 1
    	while j <= i:
    		print(f"{j} * {i} = {i * j} ",end = "")
    		j += 1
    	print()
    	i += 1
    

3.2.3 for…else…

  • 常用场景: 定义循环结束之后要执行的操作,若循环终止,else下缩进代码不执行
  • 语法:
    for 变量 in 容器:
        重复执⾏的代码
    else:
        循环正常结束执行的代码
    

4 函数

4.1 定义和调用

def 函数名():
    封装的代码
函数名()

把具有独立功能的代码块组织为一个小模块,在需要的时候调用,函数名应符合标识符的命名规则。

若全局变量的数据类型是可变类型,在函数内部可以使用方法修改全局变量的内容,不会改变变量的引用,在函数内部使用赋值语句才会改变变量的引用。

list = [1,2,3,4]
print(f"初始时全局变量地址为:{id(list)}")
def demo1(str):
    list.extend(str)
    print(f"使用方法改变全局变量内容后的地址为:{id(list)}")
demo1("haha")

def demo2(list1):
    list = list1
    print(f"对全局变量进行赋值后的地址为:{id(list)}")
demo2([1,2])

# 最后输出为:
 # 初始时全局变量地址为:4318497216
 # 使用方法改变全局变量内容后的地址为:4318497216
 # 对全局变量进行赋值后的地址为:4318497280

4.2 作用

在开发程序时,通过函数提高代码的重用率,从而提高开发效率。

如果函数内部处理的数据不确定,可以将外界的数据以参数形式传递到函数内部。

如果希望一个函数执行完成后, 向外界汇报执行结果,就可以增加函数的返回值。

4.3 函数的文档注释

在定义函数下方通过三对连续的引号,在引号间编写对函数的说明文字;函数体相对独立,其定义上方,应和其他代码(包括注释) 保留两个空行。

在函数调用位置, 使用快捷键 CTRL + Q 可以查看函数的注释信息。

4.4 函数参数

(1)作用

  • 增加函数的通用性, 针对相同的数据处理逻辑, 能够适应更多的数据。
  • 函数调用时, 按照函数定义的参数顺序, 把希望在函数内部处理的数据, 通过参数传递。
  • 在函数内部, 把参数当做变量使用, 进行需要的数据处理。

(2)使用

def 函数名(形参1,形参2)
     封装的代码

在调用函数时,把参数传递到函数内部:

函数名(实参1,实参2)

(3)形参

定义函数时, 小括号中的参数, 是用来接收参数用的, 在函数内部作为变量使用。

(4)实参
调用函数时,小括号中的参数,用来把数据传递到函数内部。

(5)不可变参数和可变参数

  • 无论传递的参数是可变类型还是不可变类型,只要针对参数使用赋值语句,就会在函数内部修改局部变量的引用,不会影响到外部变量的引用。
  • 传递可变类型参数,在函数内部,使用方法修改了数据的内容,同样会影响到实参变量。
  • 列表变量调用 += 本质上是在执行列表变量的 extend 方法,不会修改变量的引用。

(6)缺省参数

  • 定义函数时,可以给某个参数指定一个默认值,具有默认值的参数就叫做 缺省参数。

  • 调用函数时, 如果没有传入缺省参数的值,则在函数内部使用定义函数时指定的参数默认值。将常见的值设置为参数的缺省值, 从而简化函数的调用

  • 需注意:

    • 带有默认值的缺省参数必须在参数列表末尾。
    • 如果函数有多个缺省参数,在调用函数时,需要指定参数名,以便解释器清楚参数的对应关系。
  • e.g.

def print_info(name,  gender = True, hobby = ""):
   gender_defaut = "女"
   if not gender:
       gender_defaut = "男"
   print(f"姓名:{name},性别:{gender},爱好:{hobby}")
print_info("张三")  #输出:姓名:张三,性别:女,爱好:
print_info("张三",gender = False)  #输出:张三,性别:男,爱好:
print_info("张三",hobby = "打球")  #输出:姓名:张三,性别:女,爱好:打球
  • 需要使用最常见的值作为默认值缺省值。
  • 若一个参数的值不能确定,则不应设置默认值,具体的数值在调用函数时,由外界传递。

(7)多值参数
有时可能需要一个函数能够处理的参数个数是不确定的,这个时候,就可以使用多值参数:

  • 参数名前增加 一个 * :接收元组,一般命名为:*args
def sum(*args):
    sum = 0
    for i in args:
        sum += i
    return sum
print(sum(1,2,3))
  • 参数名前增加 两个 * :接收字典,一般命名为:**kwargs

元祖和字典的拆包:

  • 在调用带有多值参数的函数时, 如果希望将一个 元组变量直接传递给 args,或将一个字典变量直接传递给 kwargs,就可以使用拆包简化参数的传递,拆包的方式是:
  • 在 元组变量前, 增加 一个 *
  • 在 字典变量前, 增加 两个 *
def demo(*args, **kwargs):
    print(args)
    print(kwargs)
nums = (1, 2, 3)
zhangsan = {"name": "张三", "age": 18}

# 会把 nums 和 zhangsan 作为元组传递给 args
demo(nums, zhangsan) # 输出:
# ((1, 2, 3), {'name': '张三', 'age': 18})
# {}

# 将⼀个元组变量/字典变量传递给函数对应的参数
demo(*nums, **zhangsan) # 输出:
# (1, 2, 3)
# {'name': '张三', 'age': 18}

4.5 函数返回值

返回值是函数完成工作后,给调用者的一个结果,用 return 关键字返回,可以使用变量接收结果,return关键字后的代码不会被执行。

在 Python 中, 可以将一个元组使用赋值语句同时赋值给多个变量(变量的数量需要和元组中的元素数量保持一致)。

4.6 模块中的函数

模块类似于一个工具包,想要使用模块中的函数,需要在使用import导入;在模块中定义的全局变量,函数都能提供给外界直接使用。

每一个以.py结尾的Python源代码文件都是一个模块

使用步骤:
step1: 导入模块 或 导入具体函数

import  模块名  或  
import  函数名 from  模块名

step2: 使用导入模块中定义的函数或变量

模块名.变量
模块名.函数

模块名也是一个标识符,若以数字开头,无法使用import导入

4.7 Pyc 文件

程序目录中的__virtualenv.cpython-39.pyc 文件,具体存放位置:工程名/venv/lib/python3.9/site-packages/_pycache__

(1)cpython-39中的 39 表示Python解释器的版本

(2)pyc文件是由 Python 解释器将模块源码转换的字节码文件,Python 这样保存字节码是作为一种启动速度的优化

(3)Python解释源程序的步骤:
step1: 处理源代码,编译生成一个二进制字节码
step2: 对字节码进行处理,生成CPU能够识别的机器码

(4)字节码:有了模块的字节码文件之后,下一次运行程序时,如果在上次保存字节码之后没有修改过源代码,Python 将会加载 .pyc 文件并跳过编译这个步骤,当 Python 重编译时,它会自动检查源文件和字节码文件的时间戳,如果修改了源代码,下次程序运行时, 字节码将自动重新创建。

4.8 匿名函数

(1)语法: lambda [arg1 ,arg2,.....argn]]:expression

sum = lambda arg1, arg2: arg1 + arg2
print(sum( 10, 20 )) #输出:30
  • 用lambda关键词能创建小型匿名函数,得名于省略了用def声明函数的标准步骤。
  • Lambda函数能接收任何数量的参数但只能返回一个表达式的值。

(2)匿名函数的应用:

1)自定义函数:

def sum(a,b,opt):
 print(f"a = {a},b = {b},opt = {opt(a,b)}")
sum(1,2,lambda x,y:x + y) #输出:a = 1,b = 2,opt = 3

2)作为内置函数的参数:

stus = [
 {"name": "zhangsan", "age": 18},
 {"name": "lisi", "age": 19},
 {"name": "wangwu", "age": 17}
]
stus.sort(key = lambda x: x['age'],reverse=True)
print(stus)

4.9 哈希(hash)函数

哈希函数是Python的内置函数,接收一个不可变类型的数据作为参数,返回一个哈希值(整数)。

哈希是一种算法,其主要作用是提取数据的特征码,相同内容得到相同的结果,不同的内容得到不同的结果。

在 Python 中,设置字典的键值对时,会首先对 key 进行 hash 以决定如何在内存中保存字典的数据,以方便 后续 对字典的操作: 增、 删、 改、 查。

4.10 交换两个数字的方法

(1)使用其他变量

def exchange(a,b):
    temp = a
    a = b
    b = temp
    print(f"第一个数字是{a},第二个数字是{b}")
exchange(1,2) #输出: 第一个数字是2,第二个数字是1

(2)不使用变量

def exchange(a,b):
    a = a + b
    b = a - b
    a = a - b
    print(f"第一个数字是{a},第二个数字是{b}")
exchange(1,2) #输出:第一个数字是2,第二个数字是1

(3)利用元祖

def exchange(a,b):
    a,b = b,a
    print(f"第一个数字是{a},第二个数字是{b}")
exchange(1,2) #第一个数字是2,第二个数字是1

5 变量

5.1 变量的引用

变量和数据是分开存储在内存中的,变量中保存着数据在内存中的地址,这个地址,就叫做引用。如果变量已经被定义,当给一个变量赋值的时候,本质上是修改了数据的引用。变量保存数据地址的过程即为引用。使用 id() 函数可以查看变量中保存数据所在的内存地址。在 Python 中,函数的参数传递以及返回值都靠引用传递。

5.2 可变类型和不可变类型

(1)不可变类型: 内存中的数据不允许被修改。

  • 数字类型:int , bool , float , complex , long
  • 字符串:str
  • 元组:tuple
    本质上不可变量类型在原值发生变化时,重新开辟空间生成了一个值的存储区域并引用了新的地址。

(2)可变类型: 内存中的数据可以被修改。

  • 列表:list
  • 字典:dict
    可变类型的数据变化是通过方法实现的,如果给一个可变类型的变量, 赋值了一个新的数据,其引用会修改。

5.3 局部变量和全局变量

(1)局部变量: 在函数内部定义的变量,只能在函数内部使用。

  • 函数执行结束后,函数内部的局部变量,会被系统回收。
  • 不同的函数,可以定义相同的名字的局部变量,彼此之间不会产生影响。
  • 生命周期:局部变量在函数执行时才会被创建,执行结束后即被系统回收,局部变量在生命周期内,可以用来存储函数内部临时使用到的数据。

(2)全局变量: 在函数外部定义的变量, 所有函数内部都可以使用这个变量。

  • 函数不能直接修改全局变量的引用,使用赋值语句修改全局变量的值。
  • 如果在函数中需要修改全局变量, 需要使用 global 进行声明。
  • 为了保证所有的函数都能够正确使用到全局变量, 应该将全局变量定义在其他函数的上方。
  • 为了避免局部变量和全局变量出现混淆,在定义全局变量时,有些公司会有一些开发要求, 如:加 g_ 或者 gl_ 的前缀

在函数执行时,首先查找函数内部是否存在指定名称的局部变量,若存在,直接使用;如果没有,则查找函数外部是否存在指定名称的全局变量,若存在,直接使用。如果还没有,程序将抛出异常。

6 常用内置函数

(1) len(item)

  • 计算容器中元素个数

(2)del
1)del 容器名[索引]

  • 通过索引删除容器中元素

2)del( 容器名[索引] )

  • del( ) 函数 通过索引删除容器中元素

3)del 容器名

  • 将容器从内存中删除

4)del( 容器名 )

  • del( )函数 将容器从内存中删除

注意:
字符串和元祖不支持 del 容器名[索引] 或 del( 容器名[索引] )

(3)max(item)

  • 返回容器中元素最⼤值
  • 如果是字典, 只针对 key 比较

(4)min(item)

  • 返回容器中元素最小值
  • 如果是字典, 只针对 key 比较

注意: 字符串比较本质是比较字符串对应的ASCII码

7 其他

7.1 生成随机数

step1: 导入随机数工具包

  • import random

step2: 生成随机数

  • random.randint(a, b) , 返回 [a, b] 之间的整数, 包含 a 和 b

7.2 break 和 continue

7.1 break

  • 在循环过程中,如果某一个条件满足之后, 不再希望循环继续执行,可以使用 break 退出循环

7.2 continue

  • 在循环过程中,如果某一个条件满足之后,不希望执行循环代码,但是又不希望退出循环,可以使用 continue

  • 结束本次循环(不执行continue后的循环体语句),执行下次循环

  • * 条件处理部分的代码,在continue之前⼀定要修改计数器, 否则会陷⼊死循环

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值