03-python基础

发布时间 2023-12-13 10:34:46作者: zxinlog

python

变量的引用

python 中函数的参数传递以及返回值都是通过引用传递的。

python 中的变量和数据分开存储,变量中存储的不是数据,而是数据的内存地址。

通过 id() 查看变量在内存中的地址。

因此,当改变变量的时候,其实是改变了变量所保存的地址,也就是 修改了数据的引用。

可变和不可变类型

数据类型中分为可变类型和不可变类型,

可变类型是列表、字典和集合,其中的数据元素可以变化。

不可变类型是数字类型、字符串和元组。其中定义后就不能变化。

不可变意味着定义后不能变化,而非变量名不能去引用其他数据。

str = 'hello'
str[0] = 'H' # error 不可变类型,会引发TypeError

字典中的key 只能使用不可变类型。

可变类型的数据变化,是通过方法来实现的。

python中有一个hash函数,通过接收一个不可变类型的参数,返回一个整数。

字典中的数据存储时,会先调用hash获取key的特征码,随后再进行存储,也就是说,字典体现的就是哈希表。

局部变量和全局变量

局部变量是定义在函数内部的变量,函数执行结束,资源清理回收。

全局变量是定义在函数外部的变量,全局都可以使用。

  • 函数执行时,会首先在函数内部查找存不存在指定名称的局部变量,如果存在,则直接使用。

  • 如果没有,则查看全局位置是否存在指定名称的全局变量,如果存在,则直接使用

  • 若还未找到,则报错

函数不能修改全局位置的变量的引用,或者说,即使想要修改,也不过是定义了一个和全局变量同名的一个变量。

num = 10

def func():
	num = 100  # 此处并非修改num,而是定义了一个名为num,值为100的变量。
	

函数内部不能修改全局变量。如果需要修改全局变量,则需要显式声明该变量为 global

num = 10

def func():
	global num	 # 此处表明num是一个全局变量
	num = 100  

代码结构

shebang:#!标识
import 模块
全局变量
函数定义
执行代码

为了将全局变量和局部变量相区分,可以在全局变量前添加 g_ 前缀。

高级变量类型

列表、元组、字典、字符串、公共方法、变量高级、集合(Set)

列表

列表以【】包含,下标从 0 开始,是其他语言中的数组。

name_list = ['abc', 'xyz']

如果获取值时,索引超过了范围,则报错。

len(列表) 获取列表的长度
列表.count(数据) 获取该数据在列表中出现的次数
列表[索引] 从列表中取值
列表.index(数据) 获取数据第一次出现时的索引
del 列表[索引] 删除指定索引的数据
列表.sort() 升序排序
列表.sort(reverse=True) 降序排序
列表.reverse() 反转
列表.remove[数据] 删除第一个出现的指定数据
列表.pop 删除末尾数据
列表.pop(索引) 删除指定索引的数据
列表.insert(索引,数据) 在指定位置插入数据
列表.append(数据)  在末尾追加数据
列表.extend(列表2) 将列表2的数据追加到列表1
列表.clear() 清空数据

记住几个常用的就可以了,用到的时候再查询。

del 不仅可以删除列表中的数据,还可以直接删除列表。

关键字

keyword 是关键字。

import keyword
print(keyword.kwlist)
print(len(keyword.kwlist))

方法和函数类似,但方法需要通过对象 . 的形式进行调用。

循环遍历

从头到尾以此从列表中获取数据,在循环体内部针对每一个元素,执行相同操作。

使用for in就可以实现

name_list = ['abc', 'xyz']
for name in name_list:
	print(name)

元组

元组是用小括号包裹起来的列表,列表和元组之间可以通过关键字 list 或 tuple 进行相互转换。

元组中的值不可以改变,这个特性可以保护元组中的值。

字典

字典是使用 {} 包含起来的,由键值对进行组合。

info_dict = {"key":"value"}

value 可以使用任意数据类型,但key只能使用不可变类型,如数值、字符串等。

默认参数

python 中的函数支持默认参数,默认参数就是函数参数的一个默认值,如果在调用该函数的时候没有写明参数,则使用默认值。默认值从后往前写,另外,如果指定了一个参数名,则后面的参数名也需要指定。

多值参数

函数处理不固定数量的参数。*arg 表示元组, ** kwargs 表示字典,且 *arg 必须在 **kwargs 之前

# 计算所有参数的和
def sum(*args):
    sum = 0
    for arg in args:
        sum += arg
    return sum


print(sum(1, 2, 3, 4, 5))

刚才所演示的是将多个变量传入到一个多值参数的函数。

如果我本身就有元组或者字典的话,可以通过 拆包/解包 的方式,将元组或字典传递给函数。

def sum(*args, **kwargs):
	xxx

info_tuple = (1,2,3)
info_dict = {'a':1, 'b':2}

sum(*info_tuple, **info_dict)

递归

函数可以调用其他函数,当然也可以调用自身。

但是需要创建一个出口,如果没有出口,递归就会成为死循环。

def print_num(num):
    print(num)
    if num == 1:
        return
    print_num(num - 1)