Chapter 2 - Python中的变量和简单的数据类型

0 阅读9分钟

Python中的变量和简单的数据类型

与其他的编程语言声明变量的方式差别不大,这里Python语言是强类型,即变量的数据类型是由当前引用的数据对象来决定。

补充:

在很多编程语言中,定义变量时除了需要指明变量的名字,还需要告诉计算机它是什么类型,是简单的整数、浮点数、字符串,还是复杂的类、结构体、数组。

而编程语言中的数据最终都要放到内存中,在内存中存取数据要明确三件事情:数据存储地址(决定数据存储位置)、数据的长度(决定了当前数据使用了多少字节)以及数据的处理方式(决定了数据的转换方式和运算方式)。

每种编程语言都有自己的数据类型系统,在声明变量时翻译成计算机可以理解的机器语言,变量名称决定了数据的存储地址,数据类型则决定了数据的长度和处理方式,eg: int n; char c; float number……。

静态类型和动态类型

静态类型指的是在创建一份数据(变量、参数、返回值等)时需要显式指明该数据的类型。通常情况下,这些数据的类型一旦被定义,在程序的整个生命周期也不再改变。常见的编程语言:C/C++、Java、C#、Go等

动态类型的编程语言在创建数据时往往不需要指明该数据的类型,而且数据的类型也会随着值的改变而改变,给数据赋予不同的值,数据将得到不同的类型。对动态类型语言,类型是推断出来的,甚至可以在程序运行期间更改。常见的编程语言:JavaScript、PHP、Python、Ruby等

两者的优劣区间:

静态类型语言需要预先明确地告诉编译器要处理的数据的类型,这样在程序部署之前就能发现代码中的错误或者疏忽。比如尝试将两个类型不同的变量相加,那么编译器在编译期间可能就会捕获这种语法错误,并且不会让我们完成程序的构建。但是有时候也有可能会因为疏忽或者知识缺陷导致一些问题,比如C/C++语言当中1/3得到的结果是0,而不是0.3333……

动态类型语言为我们提供了更多灵活性。然而问题在于,解释器有时候会对数据类型做出错误的猜测,我们在编写代码的过程中必须时刻警醒,因为解释器不会给出错误提示。动态语言中的数据类型通常在程序运行期间才能确定,这使得程序在被部署到生产环境之前很难捕获太多错误。程序可能在你的本地机器上正常工作,但是生产环境可能略有不同,解释器就会产生一些不同的猜测,这将导致潜在的风险。

强类型和弱类型:

强类型语言一旦变量被指定某个数据类型,如果不经强制转换,即永远是此数据类型。它们不会处理与类型定义明显矛盾的运算,而是把它标记为一个问题,并作为错误抛出。

弱类型语言是一种数据类型可以被忽略的语言。它与强类型定义语言相反, 一个变量可以赋不同数据类型的值。当我们执行一些与类型定义不匹配的运算时,弱类型语言尝试提供帮助,它可能会临时转换值的类型,让它符合当前运算。

两者优劣区间:

强类型语言是严谨的,它要确保程序员明确地知道自己在做什么。如果发生错误,强类型语言认为这是程序员不了解当前的运算规则导致的,或者程序员对正在处理的问题含混不清。强类型使得程序被部署到生产环境时更加强壮,不易出错;但是,我们需要付出更多成本,这包括花费更所时间编写代码,以及解决更多细枝末节的问题。

弱类型语言消除了强类型语言的严格性,在较大程度上允许程序构建并正常运行,因此弱类型语言更有灵活性和表达性。弱类型语言不利的一方面是,它可能错误地猜测程序员的意图,并得到不被期望的运行结果。

变量

  • 变量声明方式:

    message = "Hello Python world!"
    

    这里就是声明了一个字符串变量message。其类型是由=后面的数据对象来决定。

    我们可以通过type函数来观察message变量的数据类型。

    message = "Hello Python world!"
    print(message)
    print(type(message))
    

    运行结果:

    image-20260226154639604

    如果我们后续变更了message变量的值,会展示什么样的结果

    message = "Hello Python world!"
    print(message)
    print(type(message))
    message = 1
    print(message)
    print(type(message))
    

    运行结果:

    image-20260226154901841

    我们可以观察到不仅仅变量的值变了,其数据类型也发生了变化。

    Python中还可以同时对多个变量进行赋值:

    x, y, z = 0, "str", True
    print(x)
    print(y)
    print(z)
    

    运行结果:

    image-20260227101430078

  • 变量命名规则:(在python的命名规范中一般使用小写字母单词加下划线分隔的方式,eg:length_of_name)

    • 只能包含字母、数字和下划线,且只能以字母或者下划线打头。
    • 不要将Python的关键字作为变量名称。

常量

常量是在程序的整个生命周期内都保持不变的变量。而在Python中并没有严格的常量类型,而是根据程序员对变量命名方式的不同进行区分。

字符串

字符串就是一系列字符,用单引号/双引号引起的。

这种灵活性可以方便字符串中使用单引号、撇号和双引号

'I told my friend, "Python is my favorite language!"'
"The language 'Python' is named after Monty Python, not the snake."
"One of Python's strengths is its diverse and supportive community."

同时如果之前了解过其他编程语言,我们可以知道,在字符串中还可以添加转义字符来定义字符串

"Country: \n\tChina \n\tAmerica \n\tAustralia"
  • 使用变量来定义字符串

    first_name = "James"
    last_name = "Bob"
    full_name = f"{first_name} {last_name}"
    print(full_name)
    

    执行结果:

    image-20260226160602364

    通过上述例子可以看到,我们可以通过使用已有的字符串变量来定义一个新的字符串,可以现在左引号前面加上f,再将要引入的变量放在大括号当中。这种字符串称为**f字符串**。

    user_name = "name=%s"%("James")
    user_info = "name=%s, age=%d"%("James", 14)
    print(user_name)
    print(user_info)
    

    执行结果:

    image-20260227143717737

    我们还可以通过%的方式定义新的字符串。其中%s%d被称为占位符。主要的占位符包括:

    符号说明
    %s对象str方法的返回值(一般选择这种方式)
    %r对象的repr方法的返回值
    %d%i数字格式化
    %f浮点数格式化
    %.nf浮点数保留n位小数
    %x%X数字格式化位16进制(x,X大小写)
    %c格式化字符及其ASCII码
    %e科学计数法标识的浮点数(e小写)
  • 字符串分类:

    • 普通字符串

    • 原字符串:使用r开头定义的字符串

      s = r'c\c++\Python'
      #输出展示结果:c\c++\Python
      
    • Byte类型:b开头

  • 编码格式:

    可以通过使用encode()decode()方法实现对字符串的编码和解码,python的默认编码规则是unicode,我们通过某一编码规则编码的时候,解码也需要使用相同的编码规则,否则会出现乱码的情况。

  • 字符串常用的方法:

    • title():将每个单词的首字母变成大些
    • upper():将字符串中的所有字母转换为大写
    • lower():将字符串中的所有字母转换为小写
    • capitalize():将字符串首字母大写
    • swpacase():将字符串中的大小写交换
    • rstrip(char=None……):将字符串右端的chars字符集合(默认为空字符)删除
    • lstrip(char=None……):将字符串左端的chars字符集合(默认为空字符)删除
    • strip(char=None……):将字符串两端的chars字符集合(默认为空字符)删除
    • removeprefix({prefix}):删除字符串中的前缀
    • removesuffix({suffix}):删除字符串中的后缀
    • find({sub}, {start}, {end}):从前向后查找,返回sub在字符串中第一次出现的位置,不存在返回-1,startend限定查找范围。
    • rfind({sub}, {start}, {end}):从后向前查找,功能同find()
    • index({sub}, {start}, {end}):功能同find(),不同点是sub在字符串当中不存在的时候报异常。
    • count({sub}, {start}, {end}):返回sub在字符串中出现次数。
    • replace({old}, {new}, count):将old使用new替换,count是替换的数量。
    • split(sep=None, maxsplit=-1):从前向后通过sep对字符串切分,返回切分子串组成的列表。sep默认所有空字符(包括空格、回车、制表符等),maxsplit默认切分所有。
    • rsplit(sep=None, maxsplit=-1):从后向前通过sep对字符串切分,返回切分子串组成的列表。sep默认所有空字符(包括空格、回车、制表符等),maxsplit默认切分所有。
    • join({iterable}):使用字符串(这时字符串是作为连接符使用)将迭代对象中的元素(字符串类型)拼接成新的字符串。
    • startswith({prefix}, {start}, {end}):字符串以指定子串开头返回True,否则返回False。prefix是子串,start是起始索引,end是结束索引。
    • endswith({suffix}, {start}, {end}):字符串以指定子串开头返回True,否则返回False。suffix是子串,start是起始索引,end是结束索引。
    • isalpha():判断字符串中是否只由字母组成
    • isdigit():判断字符串是否只由数字组成
    • isupper()/islower():判断字符串是否所有字符都是大/小写
    • isspace():判断字符串中所有字符是否都是空格。
    • istitle():判断字符串中所有单词拼写是否首字母为大写,其他均为小写。

数包含两种基本数据类型:

  • 整数:整数可以执行加(+)、减(-)、乘(*)、除(/)、乘方(**)运算。
  • 浮点数:因为计算机存储数据是使用二进制的方式进行存储,但是对于无法被 2 的幂整除的十进制小数运算的时候就有可能产生尾差,最为经典的就是0.2 + 0.1

需要注意的是将任意两个数相除,结果总是浮点数,即便这两个数都是整数且能整除。

在python中无论是哪种了算术运算,只要是有操作数是浮点数,默认得到的就总是浮点数。

image-20260227101113233

注释

Python中使用#来标识注释行。