30天Python入门到进阶——第2天:数据类型(Ⅰ)

30天Python入门到进阶——第2天:数据类型(Ⅰ)

前言

在深入研究编程语言甚至人类语言的基本细节之前,我们需要了解它的术语和基本原理,并开始构建一个基本的心理模型,我们可以在必要时用作参考。

任何编程语言的构建块主要可以分为以下几类:

  • 术语
  • 数据类型
  • 动作(函数)
  • 最佳实践

今天我花了一些时间来讲解一些基本的 Python 术语、语法、它的数据类型和它的一些操作,或者在编程术语中被称为函数。

变量

变量存储值。在 python 中,这些是变量命名约定:

  • 变量应以字母(最好是小写)或下划线开头,后面可以跟数字或下划线
  • Snake case是变量的常规写法如​​user_name​​​,单词间用下划线隔开(Javascript推荐驼峰命名,比如:​​userName​​)
  • 它们区分大小写
  • 不能直接命名关键词变量(查看官方文档《Python 关键字》)

30天Python入门到进阶——第2天:数据类型(Ⅰ)

那么如果,真的犯了这个错,会怎么样呢?举个例子:

>>> if = 1
SyntaxError: invalid syntax
>>> print(and)
SyntaxError: invalid syntax
>>> def = "hi"
SyntaxError: invalid syntax

看到没有?直接提示语法错误。

除了不能使用关键字作为标识符,前面我们也强调过了,也不能使用内置函数同名的标识符。Python有很多内置函数,以sum为例,这是一个求和的函数,我们看一下错误的命名导致的后果:

>>> sum([1,2,3,4])
10
>>> sum = "错误标识符名"
>>> sum([1,2,3,4])
Traceback (most recent call last):
File "<pyshell#19>", line 1, in <module>
sum([1,2,3,4])
TypeError: 'str' object is not callable

先不管sum([1,2,3,4])的意义,它的作用是把1/2/3/4加在一起得到10,然后错误的给一个变量也取了个sum的标识符名称,再后面又调用sum([1,2,3,4])的时候,程序抛出异常,错误原因是str不是可调用的类型。归根到底就是sum这个名字重名了的原因。

数据类型

简单来说,数据类型是一种表示值的方式。在我们的现实世界中,我们将字母、数字、符号作为不同类型的常用值。同样,Python 包含以下基本数据类型:

  • int(整数)
  • float(浮点数)
  • str(字符串)
  • bool(布尔值)
  • list(列表)
  • tuple(元祖)
  • set(集合)
  • dict(字典)
  • complex(复数)
  • None(空值)

这些是 Python 中可用的标准数据类型。要创建我们自己的自定义类型,需要使用类。也可以通过导入外部库或模块来使用专门的数据类型。

相反,在 JavaScript 中,有以下可用的原始类型:

  • number (数字:整数和小数)
  • string(字符串)
  • boolean(布尔值)
  • symbol(符号:唯一、不可变
  • bigInt(大整数)
  • null(空值)
  • undefined(对象也是非原始类型)

今天我只是花时间整理 Python 的数字和字符串类型。

数字

有 3 种数字数据类型:

  • int(存储无限大小的整数)
  • float(存储浮点实数值)
  • complex(我现在只是跳过它,因为我了解到它不常用,类似于 JavaScript 中的 bigInt)。

相比之下,JavaScript 有两种数值数据类型,NumberBigInt
​​​type​​​函数用于确定值或表达式的类型。(类似于 JavaScript中的​​typeof​​运算符)

num = 100 # variable assignement
print(type(num)) # <class 'int'>

num2 = 99.99
print(type(num2)) # <class 'float>

expression1 = num * 10
print(type(expression1)) # <class 'int'>

expression2 = num + num2
print(type(expression2)) # <class 'float'>

在 Python 中,变量赋值是通过编写名称并使用​​=​​​运算符赋值来实现的。
在 JavaScript 中,变量名需要以​​​var​​​,​​const​​​或​​let​​关键字开头。

数学计算

对于数学计算,除了前面提到过的简单的加减乘除等等,更多的科学计算需要导入​math​这个库,它包含了绝大多数我们可能需要的科学计算函数,如下表。有一些内置的数学函数可以让我们轻松计算各种数学运算。

函数

返回值 ( 描述 )

abs(x)

返回数字的绝对值,如abs(-10) 返回 10

ceil(x)

返回数字的上入整数,如math.ceil(4.1) 返回 5

exp(x)

返回e的x次幂(ex),如math.exp(1) 返回2.718281828459045

fabs(x)

返回数字的绝对值,如math.fabs(-10) 返回10.0

floor(x)

返回数字的下舍整数,如math.floor(4.9)返回 4

log(x)

如math.log(math.e)返回1.0,math.log(100,10)返回2.0

log10(x)

返回以10为基数的x的对数,如math.log10(100)返回 2.0

max(x1, x2,...)

返回给定参数的最大值,参数可以为序列。

min(x1, x2,...)

返回给定参数的最小值,参数可以为序列。

modf(x)

返回x的整数部分与小数部分,两部分的数值符号与x相同,整数部分以浮点型表示。

pow(x, y)

x**y 运算后的值。

round(x [,n])

返回浮点数x的四舍五入值,如给出n值,则代表舍入到小数点后的位数。

sqrt(x)

返回数字x的平方根

acos(x)

返回x的反余弦弧度值。

asin(x)

返回x的反正弦弧度值。

atan(x)

返回x的反正切弧度值。

atan2(y, x)

返回给定的 X 及 Y 坐标值的反正切值。

cos(x)

返回x的弧度的余弦值。

hypot(x, y)

返回欧几里德范数 sqrt(xx + yy)

sin(x)

返回的x弧度的正弦值。

tan(x)

返回x弧度的正切值。

degrees(x)

将弧度转换为角度,如degrees(math.pi/2) , 返回90.0

radians(x)

将角度转换为弧度

print(round(2.1)) # 2
print(round(5.9)) # 6
print(abs(-34)) # 34

以及两个数学常量:

常量

描述

pi

数学常量 pi(圆周率,一般以π来表示)

e

数学常量 e,e即自然常数(自然常数)。

下面是一些应用展示,注意最后的角度调用方式:

>>> math.log(2)
0.6931471805599453
>>> math.cos(30)
0.15425144988758405
>>> math.cos(60)
-0.9524129804151563
>>> math.sin(30)
-0.9880316240928618
>>> math.sin(math.degrees(30))
-0.4097717985741408
>>> math.sin(math.radians(30))
0.49999999999999994

字符串

字符串是Python中最常用的数据类型之一,使用单引号或双引号来创建字符串,使用三引号创建多行字符串。字符串要么使用两个单引号,要么两个双引号,不能一单一双!Python不支持单字符类型,单字符在Python中也是作为一个字符串使用。

字符串是不可变的序列数据类型,不能直接修改字符串本身,和数字类型一样!Python3全面支持Unicode编码,所有的字符串都是Unicode字符串,所以传统Python2存在的编码问题不再困扰我们,可以放心大胆的使用中文。

name = 'Python' # string assignment within single quotes
name2 = "Python" # string assingment within double quotes
name3 = '''This is a a very long string and supports
multiline statements as well''' # string assingment within 3 single quotes
name4 = 'Hello! "Rockstar Programmer"' # string with escaped character sequence
print(type(name)) # <class 'str'>
print(type(name2)) # <class 'str'>
print(type(name3)) # <class 'str'>
print(type(name4)) # <class 'str'>
>>> var1 = 'Hello World!'
>>> var2 = "Jack"
>>> var3 = "" # 空字符串
>>> var4 = "it's apple" # 双引号中可以嵌套单引号
>>> var5 = 'This is "PLANE"!' # 单引号中可以嵌套双引号
>>> var6 = 'what is 'your'name'
SyntaxError: invalid syntax

但是单引号嵌套单引号或者双引号嵌套双引号就会出现歧义。

>>> a = "haha"
>>> b = a
>>> a = "xixi"
>>> a is b
False
>>> a[1] = "z"
Traceback (most recent call last):
File "<pyshell#70>", line 1, in <module>
a[1] = "z"
TypeError: 'str' object does not support item assignment

虽然字符串本身不可变,但可以像列表序列一样,通过方括号加下标的方式,访问或者获取它的子串,当然也包括切片操作。这一切都不会修改字符串本身,当然也符合字符串不可变的原则。

>>> s = "hello world!"
>>> s[4]
'o'
>>> s[2:6]
'llo '
>>> s
'hello world!'

字符串连接

与 Javascript 类似,可以使用​​+​​运算符连接字符串。它只是连接或“连接”字符串。

first_name = 'Mike'
last_name = 'Tyson'
print(first_name + ' ' + last_name) # Mike Tyson

类型转换

与存在隐式类型转换(又名强制类型转换)的 Javascript 不同,如果使用不同类型执行操作,Python 将抛出错误:

user_name = 'John'
age = 40
print(user_name + age) # TypeError: can only concatenate str (not "int") to str
# This would work in Javscript where it would convert the result to string type

在 Python 中,需要显式转换类型才能执行不同类型的操作:

user_name = 'John'
age = 40
print(user_name + str(age)) # John40
print(type str(age)) # <class 'str'>

同样,字符串也可以转换为数字:

lucky_number = 7
lucky_number_stringified = str(7)
lucky_number_extracted = int(lucky_number_stringified)
print(lucky_number_extracted) # 7
发表评论

相关文章