Python基础 1 - 数据结构




  大家好,我是技术界的小萌新,今天要和大家分享一些干货。在阅读之前请先点赞👍,给我一点鼓励吧!这对我来说很重要 (*^▽^*)

一、Python 基本介绍

1、编程语言

  Python 是面向对象编译型语言。

  程序设计语言:机器语言 → 汇编语言 → 高级语言
  编译与解释:

image-20240818151540188 image-20240818151846005

2、字面量 (Literal)

  字面量:在代码中,被写下来固定的值。它与变量不同,字面量是变量值的最直接表示
  字面量是创建对象的一种快速方式,它们在 Python 中广泛使用,因为 Python 是一种非常注重可读性和简洁性的语言。使用字面量可以方便地在代码中表示数据结构。

  在 Python 中,字面量(Literal)指的是直接表示值的符号。它们是编程语言中用于创建特定数据类型实例的表达式,不需要通过函数或构造器调用。Python 中的字面量包括:

  1. 整数字面量:直接表示整数的数字,例如:42
  2. 浮点数字面量:包含小数点或使用科学计数法的数字,例如:3.141e-10
  3. 布尔字面量:表示逻辑值 TrueFalse
  4. 字符串字面量:用单引号 ('...') 或双引号 ("...") 括起来的文本序列,例如:'hello'"world"
  5. 列表字面量:用方括号括起来的有序集合,可以包含不同类型的元素,例如:[1, 2, 3]
  6. 元组字面量:用圆括号括起来的有序集合,一旦创建就不能修改,例如:(1, 2, 3)
  7. 字典字面量:用花括号括起来的无序集合,包含键值对,例如:{'key': 'value'}
  8. 集合字面量:用花括号定义的无序且不包含重复元素的集合,例如:{1, 2, 3}

  print(字面量)

  print 可以打印 Python 中的字面量,String 类型数据(值)必须用 ’ '、" " 、 “”" “”" 单、双、三引号括起来。

  • 单引号内无需双引号转义,双引号内无需单引号转义,三引号内无需单双引号转义。

  Python 常用数据类型如下:

image-20240818143910262

3、数据类型查看及转换:

  type(对象) :返回对象数据类型,print(type())显示。

  int(对象)、str(对象)、float(对象) : 转换对象数据类型。float —> int ,截断小数部分。

instance=3.1415926
print(type(str(instance)),instance)

打印:
<class 'str'> 3.1415926

4、标识符

  在 Python 程序中,可以在编程时对 变量、类、方法 等起名,统一称作 标识符 ,用来做内容的标识。

  标识符命名规则

  1. 内容限定:标识符只允许出现 英文、数字(不可以用于开头)、下划线、中文(不推荐)
  2. 大小写敏感:Python 区分大小写。
  3. 不可使用关键字:如 False、True、containue、break、class 等。

  命名规范

  1. 变量命名规范:a. 见名知意、b. 下划线命名法:多个单词组合变量名进行下划线分隔、 c. 英文字母全小写。

5、运算符

1) 算术运算符

  //:为向下取整。

image-20240821150207479

2) 赋值运算符

image-20240821150600172

多重赋值介绍: 可以不引入临时变量,交换两个变量的值。

x = 2
y = 4
x, y = y, x
print(x, y)

打印:
4 2

这里发生的事:

  • 求值:在赋值之前,Python 需要知道要赋给变量的值是什么,所以如果有表达式,会先进行表达式的计算、函数返回值的接收。
  • 赋值:这里的 y, x 的值被 Python 确定下来,即 旧值、计算后的值按变量 “,” 逗号分隔的顺序进行等号两端的一一对应赋值。
  • 交换:就结果而言,x,y 没有引入第三个变量就完成了变量交换,通过多重赋值的原理。

3) 比较运算符

image-20240821182539905

二、字符串扩展

1、字符串拼接

  除字符串之外的数据类型无法拼接。

  用法:字符串变量 + 字符串变量,字符串变量 + 字符串字面量 进行字符串拼接: print(str1 + str2,"str3" + str4)

2、字符串格式化

  通过占位符占位的形式,完成字符串拼接。

  格式 1:占位符:%s 内容转换为字符串,%d 整数类型占位,%f 浮点数类型占位。

  数字精度控制:

  %m,nd %m,nf :m 为限制数字的宽度,多余的宽度前面用空格填充(小数点也算是宽度), 宽度小于数字自身,不生效,即m<=(数字+.+小数宽度);n为控制小数点精度,要求为数字, 会进行小数的四舍五入

name="张三"; gender="男"; age=20;weight=130.567
sum="%s %s age:%d weight=%f" % (name,gender,age,weight)
print(sum)
print("%s %s age:%5d dweight=%.2f" % (name,gender,age,weight))
print("%s %s age:%.5d dweight=%14.10f" % (name,gender,age,weight))
print("%s %s age:%5d dweight=%15.10f" % (name,gender,age,weight))

打印:
张三 男 age:20 weight=130.567000
张三 男 age:   20 dweight=130.57
张三 男 age:00020 dweight=130.5670000000
张三 男 age:   20 dweight= 130.5670000000

3、字符串快速格式化

  格式 2:f"{变量}" 特点: (无占位符)不标识数据类型,不能做精度控制。 (f=format /ˈfɔːrmæt/ 格式化 )

  用途:不需要做数字类型精度控制时使用。

name="张三"; gender="男"; age=20;weight=130.567
format=f"{name} {gender} age:{age} weight={weight}"
print(format)

打印:
张三 男 age:20 weight=130.567

4、表达式的格式化

  表达式的返回结果也作为一个字符串对象,进行格式化,表达式为 算术表达式、函数

print("1 * 1 = %d" % (1 * 1))
print(f"1 * 2 = {1 * 2}")
print("该函数返回值类型为 %s" % type("string"))

打印:
1 * 1 = 1
1 * 2 = 2
该函数返回值类型为 <class 'str'>

三、bool 布尔数据类型

1、bool 类型的定义

  bool 类型的字面量: [ 不仅可以被定义,也可以通过比较运算符进行内容比较得到 ]

  • True 表示真,1
  • False 表示假,0
image-20240821182651431

  定义:方式 1:变量名 = bool 字面量 ;方式 2:比较运算符: (num1 > num2), f"{num1 < num2}"

bool_1=True
bool_2=False
print(bool_1,bool_2)
num1=10
num2=20
print(f"num1 < num2 = {num1 < num2}")
print((num1>=num2))

打印:
True False
num1 < num2 = True
False

四、其他概念

迭代(Iteration)

  迭代是指如 for、while 循环结构一直重复同一系列的操作,如遍历一个数据序列(如列表、元组、字典等)的过程。

  迭代器(Iterator)

  迭代器是一个可以记住遍历位置的对象。它是一个遵循特定协议的对象,这意味着它必须有一个名为 __iter__() 的方法,该方法返回迭代器对象本身,以及一个名为 __next__() 的方法,该方法返回序列中的下一个元素。

  生成器(Generator)

  生成器是一种特殊的迭代器,它使用yield语句返回序列的值。每次迭代到yield表达式时,它会生成一个值,并且可以在下一次迭代时从它离开的地方继续执行。

# 斐波那契数列 演示生成器:
 
def fab(max): 
    n, a, b = 0, 0, 1 
    while n < max: 
        yield b      # 使用 yield
        # print b 
        a, b = b, a + b 
        n = n + 1
 
for n in fab(5): 
    print n
    
打印:
1 
1 
2 
3 
5

  过程分析:

  yield 的作用就是把一个函数变成一个 generator,带有 yield 的函数不再是一个普通函数,Python 解释器会将其视为一个 generator,调用 fab(5) 不会执行 fab 函数,而是返回一个 iterable 对象!在 for 循环执行时,每次循环都会执行 fab 函数内部的代码,执行到 yield b 时,fab 函数就返回一个迭代值,下次迭代时,代码从 yield b 的下一条语句继续执行,而函数的本地变量看起来和上次中断执行前是完全一样的,于是函数继续执行,直到再次遇到 yield。

  总结:

  一个带有 yield 的函数就是一个 generator,它和普通函数不同,生成一个 generator 看起来像函数调用,但不会执行任何函数代码,直到对其调用 next()(在 for 循环中会自动调用 next())才开始执行。虽然执行流程仍按函数的流程执行,但每执行到一个 yield 语句就会中断,并返回一个迭代值,下次执行时从 yield 的下一个语句继续执行。看起来就好像一个函数在正常执行的过程中被 yield 中断了数次,每次中断都会通过 yield 返回当前的迭代值。

  也可以手动调用 fab(5) 的 next() 方法(因为 fab(5) 是一个 generator 对象,该对象具有 next() 方法),这样我们就可以更清楚地看到 fab 的执行流程:

>>>f = fab(5) 
>>> f.next() 
1 
>>> f.next() 
1 
>>> f.next() 
2 
>>> f.next() 
3 
>>> f.next() 
5 
>>> f.next() 
Traceback (most recent call last): 
 File "<stdin>", line 1, in <module> 
StopIteration

  当函数执行结束时,generator 自动抛出 StopIteration 异常,表示迭代完成。在 for 循环里,无需处理 StopIteration 异常,循环会正常结束。

  yield 的好处是显而易见的,把一个函数改写为一个 generator 就获得了迭代能力,比起用类的实例保存状态来计算下一个 next() 的值,不仅代码简洁,而且执行流程异常清晰。

参考: Python yield 使用浅析 | 菜鸟教程 (runoob.com)

为什么使用迭代器?

  1. 内存效率:迭代器不需要一次性将所有元素加载到内存中,特别是对于大型数据集合,这可以显著减少内存使用。
  2. 惰性计算:迭代器可以延迟计算,只在需要时生成下一个元素,这有助于提高性能。
  3. 协议遵循:遵循迭代器协议使得对象可以被 Python 的for循环和其他迭代器使用。

  文章到这里就结束了,希望我的分享能为你的技术之旅增添一抹亮色。如果你喜欢这篇文章,请点赞收藏支持我,给予我前行的动力!🚀



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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值