python从入门到精通(四):变量的进阶

第二十章:变量的进阶(理解)

目标

  • 变量的引用
  • 可变和不可变类型
  • 局部变量和全局变量

(一)变量的引用

变量和数据都是保存在内存中的。在Python中函数的参数传递以及返回值都是靠引用传递

引用的概念

在Python中

  • 变量和数据是分开存储的
  • 数据保存在内存中的一个位置
  • 变量中保存着数据在内存中的地址 变量中记录数据的地址,就叫做 引用
  • 使用id()函数可以查看变量中保存数据所在的内存地址
  • 注意:如果变量已经被定义,当给一个变量赋值的时候,本质上是修改了数据的引用
  • 变量不再对之前的数据引用 变量为对新赋值的数据引用

创建变量a 同时赋值给它1的值,但是这并不意味着它就等于1,赋值的过程是python在内存中开辟一个空间来用存储这个1,a只是指向了这个空间的地址,也就是内存地址,它相当于在这个空间外面贴了一个标签a,告诉程序这个里面存储的是1,在创建一个变量b,赋值它等于a,也就是b=a,也就是b也指向了1的空间地址,相当于1的壳子外面贴了两个标签a,b,都只是指向了值得内存地址,如果a=2,就是覆盖当前a的指向,重新指向一个地址,也就是2,但是b还是指向1的地址,这就叫传值引用
在这里插入图片描述

(二)函数的参数和返回值的传递

在Python 中,函数的实参/返回值都是是靠引用来传递来的

def test(num):
	print("-"*50)
	print("%d 在函数内的内存地址是 %x" % (num,id(num)))
	result = 100
	print("返回值 %d 在内存中的地址是 %x" % (result,id(result)))
	print("_"*50)
	# 将字符串变量返回,返回的是数据的引用,而不是数据本身
	return result
a=10
#数据的地址本质上就是一个数字
print("调用函数前 内存地址是 %x" % id(a))
# 2调用 test 函数,本质上传递的是实参保存数据的引用,而不是实参保存的数据
# 注意: 如果函数有返回值,但是没有定义变量接收
# 程序不会报错,但是无法获得返回结果
r = test(a)
print("调用函数后 实参内存地址是 %x" % id(a))
print("调用函数后 返回值内存地址是 %x" % id(r))

(三)可变和不可变类型

不可变类型,内存中的数据不允许被修改:
。数字类型int,bool,float,complex,long(2.x)
。字符串str
。元组 tuple
可变类型,内存中的数据可以被修改
。列表list
。字典dict

#不可变
a= 1   # a的值不允许修改,修改a的值只是修改了引用,内存空间中的值没有改变
a = "hello"
# 可变类型
a = [1, 2,3]  #列表的空间值可以被修改 使用append等方法来修改空间内部的值,但是地址不变
a = [3, 2,1]

在这里插入图片描述
在这里插入图片描述在这里插入图片描述

demo_list = [1,2,3]
print("定义列表后的内存地址 %d" % id(demo_list))
demo_list.append(999)  #列表内容发生了变化,但是内存地址不变
demo_list.pop(0)
demo_listremove(2)
demo list[o] = 10

print("修改数据后的内存地址 %d" % d(demo list))

demo_dict = {"name":"小明"}
print("定义字典后的内存地址 d" % id(demo_dict))
demo_dict["age"] = 18  #列表内容发生了变化,但是内存地址不变
demo_dict.pop("name")
demo dict["name"] ="老王"
print("修改数据后的内存地址 %d" % id(demo_dict))

注意:字典的key 只能使用不可变类型的数据
注意

1.可变类型的数据变化,是通过方法来实现的
2.如果给一个可变类型的变量,赋值了一个新的数据,引用会修改

  • 变量不再对之前的数据引用
  • 变量改为对新赋值的数据引用
    在这里插入图片描述
    哈希(hash)
    Python 中内置有一个名字叫做 hash(o)的函数
  • 接收一个不可变类型的数据作为 参数 。
  • 返回 结果是一个整数

哈希 是一种算法,其作用就是提取数据的特征码(指纹)

  • 相同的内容得到相同的结果
  • 不同的内容 得到不同的结果

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

  • 键值对的key必须是不可变类型数据
  • 键值对的value 可以是任意类型的数据
    在这里插入图片描述

(四)局部变量和全局变量

局部变量是在函数内部定义的变量,只能在函数内部使用
全局变量是在 函数外部定义 的变量(没有定义在某一个函数内),所有函数 内部 都可以使用这个变量

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

4 局部变量

局部变量是在函数内部定义的变量,只能在函数内部使用
函数执行结束后,函数内部的局部变量,会被系统回收
不同的函数,可以定义相同的名字的局部变量,但是各用个的不会产生影响

4.1 局部变量的作用

在函数内部使用,临时保存函数内部需要使用的数据

def demo1():
	#定义一个局部变量
	num = 10
	print("在demo1函数内部的变量是 d" % num)
def demo2():
	print("%d" % num)
# 在数内部定义的变量,不能在其他位置使用
print("%d" % num) 
demo1()
4.2 局部变量的生命周期

所谓生命周期就是变量从被创建到被系统回收的过程
局部变量在函数执行时才会被创建
函数执行结束后局部变量 被系统回收
局部变量在生命周期内,可以用来存储函数内部临时使用到的数据
在这里插入图片描述

# 生命周期
def demo1():
	# 出生: 执行了下方的代码之后,num变量才会被创建
	# 死亡: 函数执行完成销毁
	num = 10
	print("在demo1函数内部的变量是 d" % num)
	
# 函数之间命名变量的名字是相同的 不会有什么影响
def demo2():
	#和demo1的变量是相同的
	print("%d" % num)  # num会报错,因为没有被定义

print("%d" % num) 
demo1()  # demo1执行时

5 全局变量

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

#定义一个全局变量
num = 10
def demo1():
	print(num)
	
def demo2():
	print(num)
	
demo1()
demo2()
print("over")

注意:函数执行时,需要处理变量时会:

  • 1首先查找函数内部是否存在指定名称的局部变量,如果有,直接使用
  • 2.如果没有,查找函数外部是否存在指定名称的全局变量,如果有,直接使用
  • 3.如果还没有,程序报错!
    在这里插入图片描述
    在这里插入图片描述
5.1 获取指定作用域范围中的变量

在一些特定场景中,我们可能需要获取某个作用域内(全局范围内或者局部范围内)所有的变量。

1.globals 函数

globals 函数可以返回一个包含全局范围内所有变量的字典,该字典中的每个键值对,键为变量名,值为该变量的值。

#全局变量
name1 = "111"
name2 = "222"
def text1():
    #局部变量
    name1 = "111"
    name2 = "222"
print(globals())
... 'name1': '111', 'name2': '222',...}

2.locals 函数

locals 函数可以返回一个包含当前作用域内所有变量的字典。这里所谓的“当前作用域”指的是,在函数内部调用 locals 函数,会获得包含所有局部变量的字典;而在全局范文内调用 locals 函数,其功能和 globals 函数相同。

#全局变量
name1 = "111"
name2 = "222"
def text1():
    #局部变量
    name1 = "111"
    name2 = "222"
    print("函数内部的 locals:")
    print(locals())
text1()
print("函数外部的 locals:")
print(locals())
函数内部的 locals:
{'name1': '111', 'name2': '222'}
函数外部的 locals:
...'name1': '111', 'name2': '222', ...}

3.None 空值
在 Python 中,有一个特殊的常量 None(N 必须大写)。和 False 不同,它不表示 0,也不表示空字符串,而表示没有值,也就是空值。

a = type(None)
print(a)

执行以上代码,输出结果为:

<class 'NoneType'>

对于所有没有 return 语句的函数定义,Python 都会在末尾加上 return None,使用不带值的 return 语句(也就是只有 return 关键字本身),那么就返回 None。

此外,如果在条件判断语句的条件表达式中出现了 None,判断为 False。

if None:
    print("Hello")
else:
    print("判断为 False")

这里,None 是一个特殊的Python常量,表示“无”或“空”。在Python中,None 是一个布尔值为 False 的对象。所以,if None 的条件永远不会为 True
执行以上代码,输出结果为:

判断为 False
5.2 修改全局变量的引用

函数不能直接修改全局变量的引用
全局变量 是在函数外部定义的变量 (没有定义在某一个函数内),所有函数 内部 都可以使用这个变量

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

在函数内部,可以通过全局变量的引用获取对应的数据
但是,不允许直接修改全局变量的引用 --也就是使用赋值语句修改全局变量的值

如果在函数中需要修改全局变量,需要使用global 进行声明

# 全局变量
num = 10
def demo1():
	# 希望修改全局变量的值
	# 在 python 中,是不允许直接修改全局变量的值
	# 如果使用赋值语句,会在函数内部,定义一个局部变量
	global num  #定义全局变量
	num = 99  
	# 这里修改99没有用
	print("demol ==> %d" % num)
	
def demo2():
	# 这里依旧输出 10
	print("demo2 ==> %d" % num)
demo1()
demo2()
demol ==> 99
demo2 ==> 10

使用 global 后

demol ==> 99
demo2 ==> 10
5.2 全局变量的定义位置

为了保证所有的函数都能够正确使用到全局变量,应该将全局变量定义在其他函数的上方

num = 10
def demo():
	print("%d"% num)
	print("%s"% title)
	print("%s"% name)
# 再定义一个全局变量
title ="黑马程序员"
demo()
# 再定义一个全局变量
name ="小明"
# 应该将全局变量定义在其他函数的上方
#注意: 在开发时,应该把模块中的所有全局变量
#定义在所有函数上方,就可以保证所有的函数都能够正常的访问到每一个全局变量了
num = 10
title ="黑马程序员"
name ="小明"

def demo():
	print("%d"% num)
	print("%s"% title)
	print("%s"% name)
	
demo()

在这里插入图片描述

5.3 全局变量命名的建议

为了避免局部变量和全局变量出现混淆,在定义全局变量时,有些公司会有一些开发要求,例如:
全局变量名前应该增加g_或者gl_的前缀
提示:具体的要求格式,各公司要求可能会有些差异

gl_num = 10
# 再定义一个全局变量
gl_title ="黑马程序员"
# 再定义一个全局变量
gl_name =“小明"
def demo() :
	# 如果局部变量的名字和全局变量的名字相同#pycharm会在局部变量下方显示一个灰色的虚线num = 99
	print("%d"% num)
	print("%s"% gl_title)
	print("%s"% gl_name)
# 再定义一个全局变量
title =“黑马程序员
demo()

第二十一章:函数的参数和返回值

目标

  • 函数参数和返回值的作用
  • 函数的返回值 进阶
  • 函数的参数 进阶
  • 递归函数

(一)函数参数和返回值的作用

函数根据 有没有参数 以及 有没有返回值,可以相互组合,一共有 4种 组合形式

  • 1无参数,无返回值

  • 2.无参数,有返回值

  • 3.有参数,无返回值

  • 4有参数,有返回值
    在这里插入图片描述
    定义函数时,是否接收参数,或者是否返回结果,是根据实际的功能需求来决定的!

    1如果函数内部处理的数据不确定,就可以将外界的数据以参数传递到函数内部
    2.如果希望一个函数 执行完成后,向外界汇报执行结果,就可以增加函数的返回值

(二)函数的返回值进阶

在程序开发中,有时候会希望 一个函数执行结束后,告诉调用者一个结果,以便调用者针对具体的结果做后续的处理

  • 返回值是函数完成工作后,最后给调用者的一个结果
  • 在函数中使用 return 关键字可以返回结果
  • 调用函数一方,可以使用变量来接收 函数的返回结果

问题:一个函数执行后能否返回多个结果?
示例 – 温度和湿度测量
假设要开发一个函数能够同时返回当前的温度和湿度,完成返回的功能如下

在这里插入代码片
def measure():
	"“返回当前的温度”"
	print("开始测量...")
	temp = 39
	wetness = 50
	print("测量结束...")
	# 元组- 可以包含多个数据,因此可以使用元组让函数一次返回多个值
	# 如果函数返回的类型是元组,小括号可以省略社
	# return (temp, wetness)
	return temp, wetness
result = measure()
print(type(result))
print(result)

# 需要单独的处理温度或者湿度  需要记住下标--不方便
print(result[0])
print(result[1])
# 如果函数返回的类型是元组,同时希望单独的处理元组中的元素
# 可以使用多个变量,一次接收函数的返回结果
#注意:使用多个变量接收结果时,变量的个数应该和元组中元素的个数保持一致
gl_temp,gl_wetness = measure()
print(gl_temp)
print(gl_wetness)
开始测量...
测量结束...
<class 'tuple'>
(39, 50)

在这里插入图片描述
面试题 --交换两个数字
题目要求
1.有两个整数变量a=6,b = 100
2.不使用其他变量,交换两个变量的值

a = 1
b = 100
c = 0
# 解法1: -使用其他变量
c = a
a = b
b = c

#解法2: -不使用其他的变量
a = a + b
b = a - b
a = a - b
#解法3: -Python 专有
a,b = (b,a)
#提示: 等号右边是一个元组,只是把小括号省略了
a,b = b,a

print(a)
print(b)

(三)函数参数的进阶

问题1:在函数内部,针对参数使用 赋值语句,会不会影响调用函数时传递的实参变量?–不会!
无论传递的参数是 可变还是不可变
只要针对参数使用赋值语句,会在函数内部修改局部变量的引用,不会影响到外部变量的引用
在这里插入图片描述

问题2:如果传递的参数是 可变类型在函数内部,使用方法修改了数据的内容,同样会影响到外部的数据

def demo(num_list):
    print("函数内部的代码")
    # 使用方法终改列表的内容
    #这里我们分两种情况,1.重新赋值的话,代表改变了原本传递进来的值的引用,相当于重新赋值了
	# 不重新复制直接使用方法修改,相当于直接修改了外部变量的引用,因为函数的参数也是传值引用的,所以num_list记录的是gl_list的内存地址,
	#列表又是可变类型的变量,使用方法可以修改内存中的值但是不能改变的引用地址
    # num_list = [7,6,8]
    num_list.append(9)  #使用方法修改了数据的内容
    print(num_list)
    print("函数执行完成")

gl_list = [1,2,3]   
demo(gl_list)   #传递的参数是 可变类型
print(gl_list)   # 影响到外部的数据

面试题 - +=
在python 中,列表变量调用+= 本质上是在执行列表变量的 extend 方法,不会修改变量的引用

def demo(num, num_list):
    print("函数开始")
    # num = num + num
    num += num
    num_list = num_list + num_list   #改变了引用
    # num_list += num_list
    # num_list.extend(num_list)   #没有改变引用 改变了值
    print(num)
    print(num_list)
    print("函数完成")

gl_num = 9
gl_list = [1,2,3]
demo(gl_num, gl_list)
print(gl_num)
print(gl_list)
函数开始
18
[1, 2, 3, 1, 2, 3]
函数完成
9
[1, 2, 3, 1, 2, 3]
3.1 缺省参数

定义函数时,可以给 某个参数指定一个默认值,具有默认值的参数就叫做缺省参数调用函数时,如果没有传入缺省参数 的值,则在函数内部使用定义函数时指定的 参数默认值函数的缺省参数,将常见的值设置为参数的缺省值,从而 简化函数的调用例如:对列表排序的方法

gl_num_list = [6, 3, 9]
# 默认就是升序排序,因为这种应用需求更多
gl_num_list.sort()
print(gl_num_list)
# 只有当需要降序排序时,才需要传递reverse’ 参数   这就是缺省参数
gl_num_list.sort(reverse=True)
print(gl_num_list)

指定函数的缺省参数
在参数后使用赋值语句,可以指定参数的缺省值

def print_info(name,gender=True):
    """
    :param name: 班上同学的姓名
    :param gender: True 男生 False 女生
    """

    gender_text ="男生"

    if not gender:
        gender_text ="女生"
    print("%s 是 %s"% (name, gender_text))
# 假设班上的同学,男生居多!  可以设置为默认值
print_info("小明")
print_info("老王")
print_info("小美",False)

提示
1缺省参数,需要使用最常见的值作为默认值!
2.如果一个参数的值不能确定,则不应该设置默认值,具体的数值在调用函数时,由外界传递!

1.缺省参数的注意事项

缺省参数的定义位置,必须保证带有默认值的缺省参数在参数列表末尾,所以,以下定义是错误的!.

def print_info(name, gender=True, title) :

2.调用带有多个缺省参数的函数

在调用函数时,如果有多个缺省参数,需要指定参数名这样解释器才能够知道参数的对应关系!

def print_info(name,title,gender=True):
    """
    :param title: 职位
    :param name: 班上同学的姓名
    :param gender: True 男生 False 女生
    """

    gender_text ="男生"

    if not gender:
        gender_text ="女生"
    print("%s 是 %s"% (name, gender_text))
# 假设班上的同学,男生居多!  可以设置为默认值
print_info("小明")
print_info("老王")
print_info("小美",gender=False)   # 指定参数名
3.2 多值参数

定义支持多值参数的函数
有时可能需要 一个函数 能够处理的参数 个数 是不确定的,这个时候,就可以使用 多值参数
python中有两种多值参数:

  • 参数名前增加一个*可以接收 元组
  • 参数名前增加 两个*可以接收字典

一般在给多值参数命名时,习惯使用以下两个名字

  • **args–存放元组参数,前面有一个*
  • **kwargs–存放字典参数,前面有两个**

args是arguments 的缩写,有变量的含义
kw 是keyword 的缩写,kwargs 可以记忆键值对参数

def demo(num,*args,**kwargs):
    print(num)
    print(args)
    print(kwargs)

demo(1,2,3,4,5,name="小明",age=18,gender=True)
1
(2, 3, 4, 5)
{'name': '小明', 'age': 18, 'gender': True}

提示:多值参数的应用会经常出现在网络上一些大牛开发的框架中,知道多值参数,有
利于我们能够读懂大牛的代码

多值参数案例 – 计算任意多个数字的和
需求
1.定义一个函数 sum_numbers,可以接收的任意多个整数
2.功能要求:将传递的 所有数字累加 并且返回累加结果

def sum(*args):    #推荐
    num = 0
    for i in args:
        num += i
    return num
result = sum(1,2,3,4,5,6,7,8,9,10)
print(result)
def sum(args):  #传递一个值,相当于传递一个元组
    num = 0
    for i in args:
        num += i
    return num
result = sum((1,2,3,4,5,6,7,8,9,10))  #调用是需要多加()  不方便
print(result)
3.3 元组和字典的拆包 (知道)

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

  • 将一个 元组变量,直接传递给 args
  • 将一个字典变量,直接传递给 kwargs

就可以使用拆包,简化参数的传递,拆包 的方式是

  • 在元组变量前,增加一个*
  • 在字典变量前,增加两个**
def demo(*args,**kwargs):
    print(args)
    print(kwargs)
# 元组变量/字典变量
gl_nums= (1,2,3)
gl_dict ={"age":18,"name":"小明"}
demo(gl_nums,gl_dict) 
demo(*gl_nums,**gl_dict)
demo
3.4 函数的递归

函数调用自身的编程技巧称为递归
递归函数的特点
特点
一个函数内部 调用自己
函数内部可以调用其他函数,当然在函数内部也可以调用自己
代码特点
1.函数内部的代码是相同的,只是针对 参数不同,处理的结果不同
2.当参数满足一个条件时,函数不再执行
这个非常重要,通常被称为递归的出口,否则会出现死循环!

def sum_number(num):
    print(num)
    # 递归的出口,当参数满足某个条件时,不再执行数
    if num == 1:   # 递归的出口
        return     #满足某个条件时,不再执行数
    #自己调用自己
    sum_number(num-1)
sum_number(3)

递归执行流程图
在这里插入图片描述

递归案例 --计算数字累加
需求
1.定义一个函数 sum_numbers
2.能够接收一个n 的整数参数
3.计算1+2+…num 的结果

#定义一个函数 sum numbers
# 能够接收一个 num 的整数参数
# 计算1+2+ ..num 的结果
def sum_numbers(num):
    #1.出口
    if num == 1:
        return 1
#2.数字的累如 num+(1...num -1)
# 假设 sum_numbers 能够正确的处理 1...num-1
    temp =sum_numbers(num-1)
    return num + temp
result =sum_numbers(3)
print(result)

在这里插入图片描述

提示:递归是一个编程技巧,初次接触递归会感觉有些吃力!在处理不确定的循环条件时,格外的有用,例如:遍历整个文件目录的结构

第二十二章:迭代器

迭代是 Python 最强大的功能之一,是访问集合元素的一种方式。
迭代器是一个可以记住遍历的位置的对象。
迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。迭代器只能往前不会后退。
迭代器有两个基本的方法:iter() 和 next()。
字符串,列表或元组对象都可用于创建迭代器:

使用for循环遍历元素

list=[1,2,3,4]
it = iter(list)    # 创建迭代器对象
for x in it:
    print (x, end=" ")

使用next遍历元素

list=[1,2,3,4]
it = iter(list)    # 创建迭代器对象
print (next(it))   # 输出迭代器的下一个元素
1
print (next(it))
2

使用next遍历元素

import sys         # 引入 sys 模块
 
list=[1,2,3,4]
it = iter(list)    # 创建迭代器对象
 
while True:
    try:
        print (next(it))
    except StopIteration:
        sys.exit()

创建迭代器

# 创建迭代器类型
class IT(object):
    def __init__(self):
        self.counter = 0

    def __iter__(self):
        return self

    def __next__(self):
        self.counter += 1
        if self.counter == 3:
            raise StopIteration
        return self.counter

# 根据类实例化来创建一个迭代器
try:
    obj1 = IT()
    v1 = next(obj1)
    print(v1)
    v2 = next(obj1)
    print(v2)
    v3 = next(obj1) # 抛出异常
    print(v3)

    obj2=IT()
    for i in obj2:  # 首先会执行迭代器对象的__iter__方法回去返回值,一直去返回的执行next对象
        print(i)
except StopIteration as e:
    print(e.value)

第二十三章:生成器

生成器
在 Python 中,使用了 yield 的函数被称为生成器(generator)。
yield 是一个关键字,用于定义生成器函数,生成器函数是一种特殊的函数,可以在迭代过程中逐步产生值,而不是一次性返回所有结果。
跟普通函数不同的是,生成器是一个返回迭代器的函数,只能用于迭代操作,更简单点理解生成器就是一个迭代器。
当在生成器函数中使用 yield 语句时,函数的执行将会暂停,并将 yield 后面的表达式作为当前迭代的值返回。
然后,每次调用生成器的 next() 方法或使用 for 循环进行迭代时,函数会从上次暂停的地方继续执行,直到再次遇到 yield 语句。这样,生成器函数可以逐步产生值,而不需要一次性计算并返回所有结果。
调用一个生成器函数,返回的是一个迭代器对象。
下面是一个简单的示例,展示了生成器函数的使用:

def countdown(n):
    while n > 0:
        yield n
        n -= 1
 
# 创建生成器对象
generator = countdown(5)
 
# 通过迭代生成器获取值
print(next(generator))  # 输出: 5
print(next(generator))  # 输出: 4
print(next(generator))  # 输出: 3
 
# 使用 for 循环迭代生成器
for value in generator:
    print(value)  # 输出: 2 1
以下实例使用 yield 实现斐波那契数列:

实例(Python 3.0+)
#!/usr/bin/python3
 
import sys
 
def fibonacci(n): # 生成器函数 - 斐波那契
    a, b, counter = 0, 1, 0
    while True:
        if (counter > n): 
            return
        yield a
        a, b = b, a + b
        counter += 1
f = fibonacci(10) # f 是一个迭代器,由生成器返回生成
 
while True:
    try:
        print (next(f), end=" ")
    except StopIteration:
        sys.exit()

第二十四章:推导式

(一)列表推导式

基础语法为:

[表达式 for 变量 in 列表] 
names = ['Bob','Tom','alice','Jerry','Wendy','Smith']
# 进行从小写到大写的转换
new_names = [name.upper()for name in names if len(name)>3]
print(new_names)
['ALICE', 'JERRY', 'WENDY', 'SMITH']

(二)字典推导式

基础语法为:

{ key: value for value in 字典 }
original_dict = {'a': 1, 'b': 2, 'c': 3}
doubled_dict = {key: value * 2 for key, value in original_dict.items()}
print("字典推导式", doubled_dict)

dict_derivation = {x: x ** 2 for x in range(1, 11)}
print("开平方", dict_derivation)

(三)集合推导式

{ 表达式 for item in 序列 }
setnew = {i**2 for i in (1,2,3)}
print(setnew)

(四)元组推导式(生成器表达式)

(表达式 for item in 序列)
a = (x for x in range(1,10))
print(a) #元组推导式返回的结果是一个生成器对象
print(tuple(a)) # 使用 tuple() 函数,可以直接将生成器对象转换成元组

第二十五章:装饰器

  • 23
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

HACKNOE

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值