python 基础系列(三) — Python中的变量进阶

本文是Python基础系列的第三篇,主要探讨Python中的变量进阶概念,包括变量的应用、可变类型与不可变类型、哈希、局部变量和全局变量,以及函数中的参数传递、递归等核心知识点。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

python 基础系列(三) — Python中的变量进阶



python基础系列索引

python 基础系列(一) — Python介绍

python 基础系列(二) — Python基本语法

python 基础系列(三) — Python中的变量进阶

python 基础系列(四) — Python中的面向对象

python 基础系列(五) — Python中的继承

python 基础系列(六) — Python的异常及其处理

python 基础系列(七) — Python中的模块

python 基础系列(八) — Python中的文件操作

python 基础系列(九) — Python中的vi – 终端中的编辑器

python 基础系列(十) — Windows CMD命令大全

python 基础系列(十一) — 使用PyCharm远程调试树莓派python代码 — Windows CMD命令大全


如果你对python感兴趣,不妨看一下我的其他文章


变量的应用

在python中

  • 变量 和 数据是分开存放的
  • 数据 保存在内存中的一个位置
  • 变量中保存数据在内存中的地址
  • 变量中记录数据的地址,叫做 引用
  • 使用 id() 函数可以查看变量中保存数据的 内存地址

注意: 如果变量已经定义,当给一个变量赋值的时候,本质上是 修改了数据的引用

  • 变量不再 对之前的数据引用
  • 变量改为 对新赋值的数据引用

实例代码

a=10
b=a
print("变量 a 的内存地址为:%s"%id(a))
print("变量 10 的内存地址为:%s"%id(10))
print("变量 b 的内存地址为:%s"%id(b))

a=20

print("赋值后,变量 a 的内存地址为:%s"%id(a))
print("赋值后,变量 20 的内存地址为:%s"%id(20))
print("赋值后,变量 b 的内存地址为:%s"%id(b))

运行结果

变量 a 的内存地址为:1628990768
变量 10 的内存地址为:1628990768
变量 b 的内存地址为:1628990768
赋值后,变量 a 的内存地址为:1628991088
赋值后,变量 20 的内存地址为:1628991088
赋值后,变量 b 的内存地址为:1628990768

可变类型和不可变类型

  • 不可变类型, 内存中的数据不允许被修改:

    • 数字类型 int、bool、float、complex、long
    • 字符串 str
    • 元组 tuple
  • 可变类型,内存中的数据可以修改:

    • 列表 list
    • 字典 dict

注意,字典中的key只能使用不可变类型不能使用可变类型

哈希(hash)

  • python 中内置了一个名字叫hash的函数

    • 接收一个 不可变 类型作为参数
    • 返回结果是一个正数
  • 哈希是一种算法,起作用是提取数据的特征码(指纹)

    • 相同的内容得到相同的结果
    • 不同的数据得到不同的结果
  • 在 python 中,设置字典的键值对时,会首先对 key 进行 hash ,已决定如何在内存中保存字典数据,以方便后续对字典操作,增、删、改、查

    • 键值对的 key 必须是不可变类型
    • 键值对的 value 可以试试任意类型

局部变量和全局变量

全局变量定义在函数的外部,所有的函数都可以使用这个变量

提示:在其他语言的开发中大多数不推荐使用全局变量,可变范围他打导致程序不容易维护

  • 在函数的内部可以通过全局变量的引用获取,全局变量的值
  • 在函数内部无法修改全局变量的值,如果尝试赋值全局变量,系统会在重新定义一个新的同名的局部变量

代码示例

# 全局变量
num = 10


def demo1():
    # 希望修改全局变量的值
    # 在 python 中,是不允许直接修改成员变量的值
    # 如果使用赋值语句,会在函数内部定义一个局部变量
    num = 99
    print("打印num的取值为 %s" % num)
    print("打印 demo1 中, num 的地址为%s" % id(num))


def demo2():
    print("打印num的取值为 %s" % num)
    print("打印 demo2 中, num 的地址为%s" % id(num))


print("函数调用前 num 的地址为%s" % id(num))
demo1()
demo2()

运行结果

函数调用前 num 的地址为1781099824
打印num的取值为 99
打印 demo1 中, num 的地址为1781102672
打印num的取值为 10
打印 demo2 中, num 的地址为1781099824

方法中使用 global关键词,指定变量的引用为全局变量

示例

# 全局变量
num = 10


def demo1():
    # 希望修改全局变量的值
    # 在 python 中,是不允许直接修改成员变量的值
    # 如果使用赋值语句,会在函数内部定义一个局部变量
    # 使用global关键词可以告诉解释器,这个变量是全局变量,方法内可以修改这个全局变量的值
    global num
    num = 99
    print("打印num的取值为 %s" % num)
    print("打印 demo1 中, num 的地址为%s" % id(num))


def demo2():
    print("打印num的取值为 %s" % num)
    print("打印 demo2 中, num 的地址为%s" % id(num))


print("函数调用前 num 的地址为%s" % id(num))
demo1()
demo2()

运行结果

函数调用前 num 的地址为1781099824
打印num的取值为 99
打印 demo1 中, num 的地址为1781102672
打印num的取值为 99
打印 demo2 中, num 的地址为1781102672

全局变量命名

gl_变量名

函数一次返回多个数据时,使用元组

  • 函数一次返回多个数据可以使用元组
  • 如果函数返回的是元组,那么小括号可以省略
  • 如果返回的数据是元组,同时又希望单独处理元组中的数据,那么可以使用多个变量,一次性的接收函数的返回值
  • 但是需要注意,变量的数量和位置一定要和元组的数量对应

示例代码:

def ontain_temp():
    # 采集温度
    temp = 18.4
    # 采集湿度
    wetness = 46
    return temp, wetness


print(ontain_temp())
# 如果函数返回的是元组,那么小括号可以省略
# 如果返回的数据是元组,同时又希望单独处理元组中的数据,那么可以使用多个变量,一次性的接收函数的返回值
# 但是需要注意,变量的数量和位置一定要和元组的数量对应
gl_temp, gl_wetness = ontain_temp()

print("当前的温度是 %s 摄氏度,当前的湿度为 %s%% " % (gl_temp, gl_wetness))

运行结果

(18.4, 46)
当前的温度是 18.4 摄氏度,当前的湿度为 46% 

面试题 、 变量交换

现在有一个变量a = 10 和 变量 b = 90 请交换变量的值

# 面试题
# 1.使用 第三个变量
a = 10
b = 90
print("交换前,打印 a = %s , b = %s" % (a, b))

c = a
a = b
b = c

print("交换后,打印 a = %s , b = %s" % (a, b))

# 2. 所有语言通用的解法

a = 10
b = 90
print("交换前,打印 a = %s , b = %s" % (a, b))
a = a + b
b = a - b
a = a - b

print("交换后,打印 a = %s , b = %s" % (a, b))

# python 中可以 , 使用元组的方式进行交换
a = 10
b = 90
print("交换前,打印 a = %s , b = %s" % (a, b))

a, b = (b, a)
print("交换后,打印 a = %s , b = %s" % (a, b))

a, b = b, a
# 元组放在等号的右侧,可以省略括号
print("交换后,打印 a = %s , b = %s" % (a, b))

函数传参

代码示例

def demo(num, num_list):
    num += num
	# 代码的本质是调用可列表的num_list.extend()方法
    num_list += num_list


gl_num = 9
gl_num_list = [1, 2, 3]

print(gl_num, gl_num_list)
demo(gl_num, gl_num_list)
print(gl_num, gl_num_list)

运行结果

9 [1, 2, 3]
9 [1, 2, 3, 1, 2, 3]

函数的缺省参数

  • 定义函数时,可以给参数 指定默认值,具有默认值的参数就叫做 缺省参数
  • 调用函数时,如果没有传入 缺省参数 的值,则在函数的内部使用定义函数时指定的 默认参数

例如

def demo3(name, title="开始"):
    print("姓名 %s , 标题 %s" % (name, title))

demo3("小张")

运行结果

姓名 小张 , 标题 开始

提示: 应该使用最常见的值作为默认值,这样函数调用时才能更简单

    1. 缺省参数的注意事项:
  • 必须保证带有默认值的 缺省参数在参数列表的末尾

所以一下的定义是错误的

def demo3(title="开始", name):
	pass
  • 2.调用带有多个缺省参数的函数
    • 在调用函数时,如果有多个缺省参数,需要指定参数名,这样解释器才能知道参数的对应关系。

代码示例:

def demo3(name, title="开始", desc="参数解释器"):
    print("姓名 %s , 标题 %s ,备注信息 %s" % (name, title, desc))


demo3("小张", desc='定义参数解释器')

运行结果:

姓名 小张 , 标题 开始 ,备注信息 定义参数解释器

函数的多只参数

定义支持多值参数的函数

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

  • python 中有 两种多值参数

    • 参数名前加一个 # 可以接收 元组
    • 参数名前增加两个 # 可以接收字典
  • 一般在给多值参数命名时,习惯使用以下两个名字

    • *args --存放 元组 参数,前面有一个 *
    • **args --存放 字典 参数,前面有两个 **
  • args 是 arguments的缩写,含义为变量

  • kw 是 keyword 的缩写,kwargs 可以记忆 键值对参数

示例程序

def demo4(num, *args, **kwargs):
    print("学号 %s" % num)
    print("考场 %s"% str(args))
    print("成绩 %s" % kwargs)


demo4("10010", 12, 2, 语文=120, 数学=142, 地理="暂无")

运行结果

学号 10010
考场 (12, 2)
成绩 {'语文': 120, '数学': 142, '地理': '暂无'}

提示: 多值参数经常出现在网络上一些大牛开发的框架中,直到多值参数有利于我们阅读大牛的代码

元组和字典的拆包

  • 在调用带有多值参数的函数时,如果希望:

    • 将一个 元组变量,直接传递给 args
    • 将一个 字典变量,直接传递给 kwargs
  • 就可以使用 拆包,简化参数的传递, 拆包 的方式是:

    • 元组变量 前,增加一个 *
    • 字典变量 前,增加两个 *

一般正常情况下,调用方法时,多个参数被当做元组直接传递给函数

代码示例

def demo5(*args, **kwargs):
    print(args)
    print(kwargs)


tuple_1 = (3, 2, 4)
dict_1 = {"name": "张三", "age": 24}

demo5(tuple_1, dict_1)

运行结果

((3, 2, 4), {'name': '张三', 'age': 24})
{}

使用拆包的形式,解释器可以将元组和字典的元素全部取出,进行传递。

代码示例

def demo5(*args, **kwargs):
    print(args)
    print(kwargs)


tuple_1 = (3, 2, 4)
dict_1 = {"name": "张三", "age": 24}

demo5(*tuple_1, **dict_1)

运行结果

(3, 2, 4)
{'name': '张三', 'age': 24}

函数中的递归

  • 函数不断的自己调用自己
  • 必须有函数的出口

代码示例

def do_sum(num):
    if num == 1:
        return 1
    temp = num + do_sum(num - 1)
    return temp


print(do_sum(3))

运行结果

6
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值