目录
一、数据类型
1、基本数据类型
2、组合数据类型
二、介绍两个函数
1、 isinstance函数
2、len函数
三、Python指针
1、指针
2、is运算符和==的区别
3、列表的指针
四、函数参数的传递
1、例子一
2、例子二
五、字符串详解
1、转义字符
2、字符串的切片
3、字符串的分割
①初级分割
②高级分割
4、字符串函数
5、字符串编码
6、字符串格式化
六、元组
1、元组的一些特点
2、元组元素的指针
3、元组赋值
4、元组的大小比较
七、用元组取代复杂分支结构
一、数据类型
在Python中主要有两种数据类型
1、基本数据类型
基本的数据类型包括:int(整型),float(浮点型),complex(复数)
2、组合数据类型
组合的数据类型包括:str(字符串),tuple(元组),list(列表),dict(字典),set(集合)
二、介绍两个函数
1、 isinstance函数
isinstance(x,y)函数用于查询数据x是否含有类型y
a = "1233456"
print(isinstance(a,str))
print(isinstance(a,int))
2、len函数
len()函数用来求组合数据类型的元素个数(长度)
a = ["123" , "hello" , "scy"]
b = "hello!!!"
print(len(a))
print(len(b))
三、Python指针
Python中,指针是一个非常重要的概念,在很多的编程语言中,都会涉及到指针,或者类似于指针的概念,而它之所以叫做指针,那么它就会像一个箭头一样,必然会指向某个地方。
1、指针
在Python中,所有的变量都是指针,也就是说,Python中所有可赋值的东西,即出现在赋值符号“=”左边的东西,都是指针!
并且我们还要注意几点:
①指针即代表着内存单元的地址
②我们可以把Python的指针理解为一个“箭头”,所有的变量都是箭头,指向了内存的某个地方
③对变量进行赋值的本质,就是让这个变量(箭头)指向某个地方
当我们对变量进行赋值时,就是相当于让变量指向某处:
a = 3
b = 4
在内存中,就是这样:
当我们用一个变量对另一个变量进行赋值时,就是相当于让两个变量指向了同一个地方:
a = b
在之前的文章我们提到过,这里的“a = b”的含义相当与“把b的值赋给a”,也就是说此时a和b都等于“4”了,那么它在内存中就会变成:
2、is运算符和==的区别
当a is b 为True时,说明a和b是指向同一个地方
当a == b 为True时,说明a和b指向的地方放着相同的东西,但是a和b不一定指向相同的地方。
当我们使用a = b 时,会使得a 和 b 指向同一个地方
下面我们来写一个代码证明一下:
a = [1,2,3,4]
b = [1,2,3,4]
print(a == b )
print(a is b)
我们这串代码在内存中应该是这样的:
所以结果就是:
注意!
对于int、float、complex、str、tuple类型的变量a和b,只需要关注a==b是否成立即可,因为这些数据本身不会更改,不会出现a的数值改变了,b的数值也跟着改变。
对于list、dict、set类型的变量a和b,a==b和a is b的结果都需要关注,因为这些数据本身会改变,改变了a指向的内容,b也许也会改变
3、列表的指针
列表的元素也可以赋值,因此也是指针,所以前面那张图更准确的来说应该是这样的:
四、函数参数的传递
函数参数的传递方式都是传值,也就是说形参是实际参数的一个拷贝,函数的参数也是指针,形参和实参指向了同一个地方,对形参赋值(让形参指向别的位置),不会影响实参
1、例子一
下面我们来看一个例子:
def Swap (x,y) :tmp = xx = yy = tmpreturn x,y
a = 4
b = 5print(Swap(a,b))
print(a,b)
我们来仔细观察这两个输出:
我们发现在这个Swap函数中,a和b的数值确实是被调换了,但是当我们输出a和b本身的数值的时候,发现本身没有改变,我们下面用一张图来解释一下:
当我们执行了tmp = x之后:
当我们再执行x = y 时,此时x的那个红箭头就指向了“5”,当我们再执行y = tmp的时候,就是让y的红色箭头指向了“4”,此时,我们就实现了参数的互换。
但是当我们用变量a和b去调用参数时,相当于把参数a和b附在了x和y上面,然后在函数体内部x和y实现了转换时,输出的“Swap(a,b)”实现了转化。
但是根据上述的步骤我们发现,从始至终a和b本身的值都没有发生变化。
2、例子二
当我们在函数执行的过程中,改变了形参指向的地方的内容,则实参所指向的地方的内容也会发生改变:
def Swap (x,y) :tmp = x[0]x[0] = y[0]y[0] = tmpreturn x,y
a = [4,5]
b = [6,7]print(Swap(a,b))
print(a,b)
我们来看一下输出的结果:
我们发现直接输出a和b他们的数值居然也发生了变化,我们来看一下下面的图:
当我们执行了tmp = x [0]
当我们再执行x[0] = y[0] 时,x[0]变成了“6”,当我们执行y[0] = tmp时,y[0]变成了“4”,相信你们已经发现了区别,我们这次并没有改变红色的箭头(指针),而是改变了这些指针所指向的位置的内容,这时这两个就都会被改变了。
五、字符串详解
1、转义字符
我们在输入print(“......”)中的文字或符号时,可能会想输出一些特殊的符号,但是这些符号可能会被编译器识别为其他的字符,导致我们输出了不符合的东西,那么我们该怎么输入呢:
我们先来看几个简单的转义字符:
转译前 | 转译后 |
\n | 换行 |
\t | 制表符 |
\" | 双引号 |
\\ | 斜杠 |
我们现在来看看代码:
print ("hello\nworld\thello\"world\"yes\\")
输出:
我们有时候不希望“\”实现被转译的功能,想让他就当作一个普通字符输出,那么我们可以在“引号”前面加一个字母r。
print (r"hello\nworld\thello\"world\"yes\\")
我们可以发现,里面所有的转义符都不起作用了
2、字符串的切片
字符串的切片,也叫子串(即字符串某连续的一部分)
我们在Python中会用a[x:y]来对字符串进行切片,会从a[x]切到a[y](不包含a[y]的那个字符)那一部分的子串
注意!
①字符串切片是一个左闭右开的区间
②a[x: ]:终点省略就是一直取到最后一个字符
③a[ :y]:起点省略就是从第一个字符开始取
④a[x : y : z]:会从a[x]切到a[y](不包含a[y]的那个字符),但是是每z个字符取一个,最后拼起来,若z为负数,就代表倒着取
⑤x和y可以都省略,就代表从头取到尾,或者从尾取到头(看z的正负)
⑥字符串切片的用法也适用于元组和列表
3、字符串的分割
①初级分割
在之前我们提到过,我们在Python中,可以用x.split()函数对字符串x进行分割,但是我们函数的括号里是什么都没有的,这就意味着我们是默认用空白字符(空格、制表符、换行符、回车符等)来对字符进行分割的,我们其实可以在()中添加一个字符,用这个字符来作为分割符,两个相同的分隔符之间会被分割出来一个空串。
看一个例子:
s = "helloxxxworldxxx!!!xxx!!!"
a = s.split("xxx")
print(a)
我们用“xxx”作为分割符,对字符串s进行分割:
它会根据分隔符,把字符串进行分割,并把各个子串放到一个列表中输出。
②高级分割
在上面的分割方法中,我们只能让某一固定的字符or子串作为分隔符,对字符串进行分割,或者用那几个空白字符,但是如果我们想要把一个文章进行分割,那么就需要根据文章里面所有的标段符号来进行分割,所以我们需要同时针对多个字符作为分隔符来分割文章:
我们在这里会导入re包来进行这个操作:
例子:
import rea = "hello,my name is Sue! Good morning ! hello : world ?? "
b = re.split(':|,|!|\?' ,a)
print(b)
我们把字符串a中的所有的标点作为分隔符来进行分割
来看看效果:
4、字符串函数
在Python中有很多关于字符串的函数:
s.count(x):求字符串s中x出现的次数
len(s):求字符串s的长度
s.upper() / s.lower():把字符串中的字符转化大写 / 小写
s.find(x) / s.index(x):查找字符串s中是否含有x
补:
①rfind()和rindex()函数用于用字符串的尾部开始查找
②虽然这两个都是关于查找的函数,但是略有一点不同,即在于这两个函数在遇到错误时的返回值不同:
我们下面来用代码看一下:
先用find函数来查找一个字符串中不包含的子串:
s = "hello world!"
a = s.find("scy")
print(a)
find函数发现字符串中不包含所要查询的子串时,会返回-1
当我们用index函数进行同样的操作时,我们会发现有不一样的结果:
s = "hello world!"
b = s.index("scy")
print(b)
程序最终会报错!
利用这个特点我们可以结合前面说到的异常处理,用try和except,这样当报错时进行对应的代码执行
s = "hello world!"try :b = s.index("scy")
except Exception as e :print(e) #将异常对象存储在变量e中
输出:
③find函数还可以从指定的起点查找:
s = "hello world!"
a = s.find("he" , 2)
#从下角标为2的元素开始查找he子串
print(a)
#输出为-1
s.replace(x,y):把字符串s中的x都替换成y
isdigit():判断字符串是否是数字
islower() / isupper() :判断字符串中是不是都是小写 / 大写
startswith() / endswith():判断字符串是否以某一个子串开头or结尾
strip():去除字符串头尾的空白字符
lstrip():去除字符串左端的(头部的)空白字符
rstrip():去除字符串右端的(尾部的)空白字符
5、字符串编码
字符串的编码在内存中的编码是Unicode的,写入文件时,可能是gbk或者utf-8
ord():字符转化为编码
chr():编码转化为字符
6、字符串格式化
我们下面会介绍两种格式化方法:
①使用format
a = "hello {0} {1:10}, you get ${2:0.4f}".format("Mr.","Mike",6.2)
print(a)
输出:
{0}代表选取后面下角标为0的元素
{1:10}代表选取下角标为1的元素,并且总共要占10个字符宽度(宽度是10),不足10个就用空格补全
{2:0.4f}代表选取下角标为2的元素,宽度是0,并且要保留四位小数
②使用%
print("Today is %s. %d." %('May' , 21))
六、元组
元组和列表在很多地方都有相似之处,我们下面会来详细的了解一下元组:
1、元组的一些特点
一个元组是由数个逗号分割的值组成,前后可加括号
a = 123456 , 000 , "hello"
这就是一个简单的元组,和列表相似,里面可以是数字,也可以字符串
如果我们想创建一个空元组,直接写一个括号即可
注意在代码中区分字符串和元组,如果末尾有逗号,就是元组,没有就是字符串,如果区分错误,可能会导致我们某些数据分析错误!
来看一个简单的例子:
a = "hello" ,
b = "hello"
print(type(a))
print(type(b))
print(len(a))
print(len(b))
输出:
可以看到,仅仅是一个逗号的差别,就是两个不同的数据类型,因为数据类型的不同,所以他们的某些数据也会不一样,比如说测量其长度(见上)
我们可以用之前遍历查找列表中的元素一样,对元组的元素进行查找,但是元组有以下的一些特殊之处:
元组不能修改,即不可增加,删除元素,不可对元素进行赋值,不可改变元素的顺序
a = 123456 , 000 , "hello"
a[0] = 5
像上面的这个例子,最终会导致程序报错,因为元组中的元素是不可以被修改的
我们虽然不能修改元组的元素,但是我们可以用加号把两个元组进行连接,
2、元组元素的指针
我们现在已经知道,元组中的元素不可修改,但是我们现在要详细的对这句话进行解析!
这里说的元素不可修改,指的是不能改变元组的元素的指向(就相当于箭头),但是变元组元素指向的内容是可能被修改的!
首先,我们先要知道,元组内部是由若干元组组成,这些元素不仅可以是数字,字符,甚至可以是一个列表,甚至是一个元组
我们来看一个简单的例子:
a = (123456 , 000 , "hello" , [2,"scy"])
a[3][1] = "scyscy"
print(a)
上面的元组中,最后一个元素是一个列表,众所周知,列表是可以更改的,所以我们对这个列表进行更改,就相当于改变了这个元素的指针所指向位置的内容,但是没有改变指针,所以这个最后是会被执行成功的!
3、元组赋值
在给元组赋值时,我们要注意元组和指针的关系:
来看一个简单小例子:
x = (1 ,2 ,3)
b = x
print(b is x) #判断是不是指向了同一个地方
#————————第一部分————————————
x += (100,) #相当于新建了一个元组
print(x)
print(b)
#————————第二部分————————————
我们先看看第一部分是内存中是怎样体现的:
当我们执行了第二部分的“x += (100,)”时,就相当于在内存中创建了一个新的地址,里面有(1,2,3,100)这个内容,而x的指针也将会指向这个内容:
我们再来看看内部的变化:
4、元组的大小比较
两个元组比大小,就是把每个元组的元素逐个比对,比如a元组的第一个元素和b元组的第一个元素进行比较,直至分出胜负
如果对应的元素不可比较,就会报错:
print((1,'a',12) < (1,'b',17))
print((1,'a') < (1,'a',13))
print((2,'a') > (1,'b',13))
print((2,'a') < ('ab','b',13))
前三个运行结果都是True
最后一个会报错(无法比较)
七、用元组取代复杂分支结构
假如我们现在想写一个根据输入对应的数字,来输出星期几的程序,如果我们想用if分支语句,需要写好几个分支,如果代码和情况更复杂,就会变得更加难写,我们可以用元组来代替分支语句:
weekdays = ("星期一" , "星期二" , "星期三" , "星期四" , "星期五" , "星期六" , "星期日")n = int(input())
if n > 7 or n < 1 :print("错误!!!!!!!!!!!!")
else :print(weekdays[n-1])
以上就是Python组合数据类型的第一部分(刷新纪录,太多字了):)