python基础之元组、集合和函数的定义与返回值

devtools/2024/11/17 0:54:06/

1.元祖

        1.元祖的定义

    元组的数据结构跟列表相似

    特征:有序、

  1. 有序:有(索引/下标/index) 正序、反序
  2. 标识符: ( ) 里面的元素是用英文格式的逗号分割开来
  3. 关键字:tuple
  4. 列表和元组有什么区别?

    元组是不可变的:程序在运行的时候,无法对其进行改变 -- 没有提供关键字、方法去操作它,没有增删改的操作

  5. 既然无法对其进行变化,那么为什么要有元组的存在?

    安全性考虑 -- 国内的省份(省、市) 变量,常量

    但凡是可以进行操作的数据,都存在安全隐患

示例:

        

python">tp = ()  # 定义一个空元组
print(type(tp))  # <class 'tuple'>tp1 = (1, 2, 3, 4, 5)  # 定义一个有值的元组
print(tp1)

2.问题res是由tp1 和 tp2 拼接在一起的,还是额外生成的? -- 额外生成的一个新元组

python">tp1 = (1, 2, 3, 4)
tp2 = (100, 3.14)res = tp1 + tp2
print(res)
print(type(res))

元组乘以int类型的数字的res1是打印两次tp1,还是额外生成一个新的元组?

python">tp1 = (1, 2, 3, 4)
tp2 = (100, 3.14)res1 = tp1 * 2
print(res1)
print(type(res1))

怎么修改元祖?

先转换成列表,修改数据,然后在转化成元组

python">tp1 = (1, 2, 3, 4)# 获取修改之前的内存地址
print(f"修改之前的内存地址: {id(tp1)}")# 1.先转换成列表
lst1 = list(tp1)
# print(lst1)
# print(type(lst1))# 2.修改数据
lst1.append(5)
# print(lst1)
# print(type(lst1))# 3.然后在转化成元组
tp1 = tuple(lst1)  # 变量的重定义 -- 对变量进行重新赋值
# print(tp1)
# print(type(tp1))# 获取修改之后的内存地址
print(f"修改之后的内存地址: {id(tp1)}")# 问题:修改之前的tp1的内存地址和修改之后的一样么? 不一样,是一个新的元组,只是引用的变量名称是一样的,但是存放的内存地址不一样

2.集合

  集合的定义

定义:由不同的元素组成的一个数据结构,无序排列的

标识符:{ }

关键字:set

特征:无序,元素不能重复,集合和集合之间可以做运算

特征:

无序排列 -- 存放在内存地址之前是无序的

集合里面的元素不能重复 -- 自动去重



集合的操作:

      进行强制转换

        

python">set1 = {"欢迎", "来到", "秋殇", "老师", "的", "博客", "!"}lst1 = list(set1)
print(type(lst1))
print(f"lst1中的第一个值:{lst1[0]}")  # 不确定、随机的

问题:如果转换完成后,连续打印,第一次的值和后面N次的值,是一样的么?

答:一样的,原理:存放内存地址之前,是随机的,但是一旦存放了,后续的内容都是固定的

集合的添加 -- add()
集合的删除 -- pop(随机删除,因为没有下标)、remove(删除指定的值).discard(提前准备好,想删除的值,删除多次,都不会报错)
python"># set1.pop()  # 随机删除,因为没有下标
# print(set1)# set1.remove("秋殇")  # 删除指定的值,如果删除不存在的值,会报错
# set1.remove("秋殇")
# print(set1)set1.discard("老师")  # 提前准备好,想删除的值,删除多次,都不会报错
set1.discard("老师")
print(set1)

集合的运算:

运算的方式:交集、并集、差集、交叉补集

交集:获取两个集合之间相同的部分 -- intersection

        

python">set1 = {"qs", "大大"}
set2 = {"qs", "dd"}print(f"获取两个集合之间相同的部分: {set1.intersection(set2)}")  # 获取两个集合之间相同的部分: {'七夜老师'}

并集:合并两个集合,自动去重 -- union

差集:获取集合中,另一个集合没有的内容 -- difference

交叉补集

python">set3 = {"qsdd" "高", "富", "帅"}
set4 = {"qsdd", "矮", "矬", "穷"}print(f"剔除公有的内容,留下双方独有的内容: {set3.symmetric_difference(set4)}")

3.函数

1.函数的定义

定义:将一段公式/逻辑代码定义在一个特定的标题(函数名称)下,通过一块,或者一行代码来执行固定好的逻辑, 而这些代码只有函数被调动的时候才会执行

通俗点:封装一些代码

核心点:函数的定义、函数的调用

函数的定义:封装好的代码,只有在调用的时候,才会执行 -- 定义函数的时候,不会执行函数内部的代码

函数的调用:语法:函数的名称() -- 调用函数,执行函数内部的代码

语法规则:

python">def 自定义的函数名称():封装的代码 ... ...

函数的参数:

定义函数的时候,可以在小括号里面定义一些参数

定义的参数,可以不给值,然后在调用函数的位置,进行传参

python">def demo1(name, age, addr):print(f"""=====demo1函数里面的参数=====name: {name}age: {age}addr: {addr}""")demo1(age=18, name="qsdd", addr="cndn")

不定长传参

        单个*号的参数:args是默认的名称,可以随意修改 -- 元组类型

python"># def demo3(*args):
#     print(f"获取到的值:{args}")
#     print(f"获取值的类型: {type(args)}")
#     print(args[0])
#
#
# demo3(1, 2, 3, 4, 5)

两个*号:kwargs是默认的名称,可以随意修改 -- 字典类型

python"># def demo4(**kwargs):
#     print(f"获取到的值:{kwargs}")
#     print(f"获取值的类型: {type(kwargs)}")
#
#
# demo4(name="七夜老师", age=18, addr="湖南长沙")

函数的返回值

1.函数的内部可以写return返回值,或者不写

2.如果不写return,也可以执行,不会报错,但是接收到的值,还是 None

3.如果写了,可以把需要传递的值,传递给调用函数的地方,通过两种方式获取(print、变量)

4.写了return但是没有传值的情况下,获取到的值是 None

5.如果有return返回值的情况下,可以通过两种方式获取

python"># def add1():  # 函数的名称: add1
#     # 需要封装的代码
#     m = 1
#     n = 2
#     s = m + n
#     print(f"m + n 的结果:{s}")
#
#
# add1()# 想获取s的值,然后进行 + 100的操作?
# print(s + 100)  # 函数的作用域问题 -- 后面的课程会讲,暂时不讲# def add2():
#     m = 1
#     n = 2
#     s = m + n
#     # 不直接写print,因为无法传递数据
#     # 通过函数的返回关键字return,把数据传递给调用函数的地方
#     return s# add2()
# 问题:此时调用函数,会不会打印s的值? -- 不会
# 因为:没有对获取到的s值,进行打印操作# 方式一:直接通过print打印获取到函数返回值
# print(f"获取到函数内部的s:{add2()}")# 方式二:通过变量接收函数的返回值,然后进行后续的操作
# res = add2()
# print(f"res + 100的值:{res + 100}")# # 写了return但是没有传值的情况下,获取到的值是 None
# def add3():
#     m = 1
#     n = 2
#     s = m + n
#     return# 如果不写return,也可以执行,不会报错,但是接收到的值,还是 None
# def add4():
#     m = 1
#     n = 2
#     s = m + n
#
#
# # 方式一:
# print(add4())
#
# # 方式二:
# res = add4()
# print(res)# lst1 = [1, 2, 3]
# print(lst1.extend("qsdd"))


http://www.ppmy.cn/devtools/18520.html

相关文章

Linux重启防火墙后容器网络无法被访问的解决办法

背景 在系统运行的时候&#xff0c;可能会操作防火墙的配置&#xff0c;可能重启防火墙。不料&#xff0c;重启防火墙之后&#xff0c;却导致运行在上面的容器无法被访问了。只能重启docker服务后才正常。 分析 docker实现容器的服务能被外部访问&#xff0c;借助的是iptable…

文字PDF转图片PDF,适合pdf防复制

完整代码已传至github平台&#xff1a; https://github.com/yaunsine/text_pdf_to_image_pdf 分成两步操作&#xff1a; 1、将文字pdf输出成图片 2、将所有图片合成为pdf 将PDF文件输出为图片的形式 """pdf转图片 """ def pyMuPDF_fitz(pdfPa…

C语言:一维数组、二维数组、字符数组介绍

数组 介绍一维数组定义应用方法初始化 举例示例结果 二维数组定义应用方法初始化 举例示例结果 字符数组定义应用方法初始化 举例示例结果分析 介绍 在C语言中&#xff0c;数组是一种基本的数据结构&#xff0c;用于存储一系列相同类型的数据。数组可以是多维的&#xff0c;最…

探索设计模式的魅力:AI赋能分层模式,解构未来,智领风潮

​&#x1f308; 个人主页&#xff1a;danci_ &#x1f525; 系列专栏&#xff1a;《设计模式》 &#x1f4aa;&#x1f3fb; 制定明确可量化的目标&#xff0c;坚持默默的做事。 探索设计模式的魅力&#xff1a;AI赋能分层模式&#xff0c;解构未来&#xff0c;智领风潮 ✨欢迎…

proteus+stm32+CubeMX+dht11+lcd1602

浅浅记录下过程遇到的问题&#x1f921;&#x1f921;&#x1f921; 1 供电网配置错误&#xff08;加上就好了 新起个名也会出这个 / 电源不起名 不创建估计项目也会&#xff09;没zet6的 proteus 里 固件库 账号注册半天没成 就用的stm32F103R6的然后发现单片机不输出高低电平…

用Python绘制了几张有趣的可视化图表

流程图存在于我们生活的方方面面&#xff0c;对于我们追踪项目的进展&#xff0c;做出各种事情的决策都有着巨大的帮助&#xff0c;而对于的Python而言呢&#xff0c;绘制流程图也是十分轻松的&#xff0c;今天小编就来为大家介绍两个用于绘制流程图的模块&#xff0c;我们先来…

【leetcode面试经典150题】75. 二叉树展开为链表(C++)

【leetcode面试经典150题】专栏系列将为准备暑期实习生以及秋招的同学们提高在面试时的经典面试算法题的思路和想法。本专栏将以一题多解和精简算法思路为主&#xff0c;题解使用C语言。&#xff08;若有使用其他语言的同学也可了解题解思路&#xff0c;本质上语法内容一致&…

STL Array、ForwardList源码剖析

STL Array、ForwardList源码剖析 参考文章: https://blog.csdn.net/weixin_45389639/article/details/121618243 array 源代码 template<typename _Tp,std::size_t _Nm> struct array {typedef _Tp value_type;typedef _Tp* pointer;typedef value_type* iterator;// Su…