天天看點

python引用資料類型有哪些_Python基礎資料類型

Python基礎資料類型

Python3 中有六個标準的資料類型:

Number(數字)

String(字元串)

List(清單)

Tuple(元組)

Set(集合)

Dictionary(字典)

不可變資料(3 個):Number(數字)、String(字元串)、Tuple(元組);

可變資料(3 個):List(清單)、Dictionary(字典)、Set(集合)。

String(字元串)

字元串簡述

str.__doc__:

str(object='') -> str

str(bytes_or_buffer[, encoding[, errors]]) -> str

Create a new string object from the given object. If encoding or

errors is specified, then the object must expose a data buffer

that will be decoded using the given encoding and error handler.

Otherwise, returns the result of object.__str__() (if defined)

or repr(object).

encoding defaults to sys.getdefaultencoding().

errors defaults to 'strict'.

Python中的字元串用單引号 ' 或雙引号 " 括起來,同時使用反斜杠 \ 轉義特殊字元。

使用r可以讓反斜杠不發生轉義。即使用r表示該字元串中所有的字元都是字元本身,不發生任何轉義。

字元串的索引方式有兩種,從前到後正序和逆序。

Python中的字元串不能改變。即不支援由索引向某個位置指派。

在Python中沒有C/C++的單字元類型,一個字元認為是長度為1的字元串

字元串索引和切片

索引對應元素的位置

python引用資料類型有哪些_Python基礎資料類型

示例:

>>> string = 'hello world!'

>>> print(string[1]) # 正序從0開始 到最後 第一個字元的索引值為 0 第二個為 1

e

>>> string = 'hello world!'

>>> string[0]

'h'

>>> string[-1] # 逆序索引 最後一個索引值為 -1 從後往前 依次為 -1、-2、-3 …

'!’

>>> string[0:6] #切片 string[起始索引:終止索引] 得到的是新的字元串

'hello '

>>> string[0:] #不寫終止索引,即為取到最後

'hello world!'

>>> string[4:]

'o world!'

>>> string[:] # 都不寫 就是全切片 從[:-1]

'hello world!'

>>> string[::-1] # 終止索引後的參數為 步長 string[起始索引:終止索引:步長]

全切片 然後逆序 步長為負 從從後往前 每次取1個

'!dlrow olleh'

>>> string[::2] # 步長為2 從前往後 隔一個取一個

'hlowrd'

注意:切片之後的結果是對原字元串的部分絕對拷貝(深拷貝),即是兩個完全獨立的對象,而不是淺拷貝或者對原對象的部分引用。

字元串的格式化

在Python中格式化迄今為止一共有四種方法 最早期的“%”方法,後來的format()方法,和3.6版本出現的f-string方法,以及子產品處理方法

格式化之“%”占位符

用法:'***%s**'%(var)   #var的值會填充到%s的位置 組成新的字元串

示例:

>>>”name :%s age :%d birthday :%s"%('monkey',20,'2010-10-20')

>>>name :monkey age :20 birthday :2019-10-20

其中 %s 稱為占位符,在字元串的後面緊跟 %和變量 如果占位符大于一個,要在%後以元組的形式傳入替換的變量常用的占位符:

python引用資料類型有哪些_Python基礎資料類型

%s 字元串

%c 字元

%d 十進制(整數)

%i 整數

%u 無符号整數

%o 八進制整數

%x 十六進制整數

%X 十六進制整數大寫

%e 浮點數格式1

%E 浮點數格式2

%f 浮點數格式3

%g 浮點數格式4

%G 浮點數格式5

%% 文字%

format()格式化

用法:

位置傳入:"*** {} *** {} *** {}***".format(var1,var2,var3)

關鍵字傳入:"*** {name} *** {name} *** {age}***".format(name = var1,age=var2)

下标傳入:"*** {0[0]} *** {0[1]} *** {0[2]}***".format([var1,var2,var3])

示例:

>>>args = ["hello","world","!","I'm","Python”]

>>>name = 'monkey'

>>>age = 18

>>>gender = '男'

>>>”name :{} age :{} ".format(name,age) # 位置傳參

>>>name :monkey age :20

>>>'{0[0]} {0[1]} {0[2]} {0[3]} {0[4]}'.format(args) # 下标傳參

>>>hello world ! I'm Python

>>>"姓名:{name} 年齡 {age} 性别 {gender}".format(name = name,age = age,gender = gender) # 關鍵字傳參

>>>姓名:monkey 年齡 18 性别 男

format格式說明:

{}中的格式限定符

python引用資料類型有哪些_Python基礎資料類型

字元串的常用方法

string = 'illoveTianTAnMen{}'

>>>string.capitalize()) # 首字母大寫

Illovetiantanmen{}

>>>string.count('ia') # 統計string中 “ia”的個數

1

>>>string.center(30,'*') # 定長的輸出30字元 string 居中 不夠的兩邊補 ‘*’

'******illoveTianTAnMen{}******'

>>>string.encode(encoding='utf-8',errors='strict') # 對string按’utf-8’編碼成bytes類型

b'illoveTianTAnMen{}'

>>>string.isalnum() # 判斷string是否是純數字和大小寫字母的組合

False

>>>string.isalpha() # 判斷string是否是純英文

False

>>>string.isdidigit() # 判斷string是否是純數字

False

>>>string.isupper() # 判斷是否全部是大寫

False

>>>'Monkey\n'.strip() # 去掉全部的空格或回車

'Monkey'

>>>'Monkeyli'.replace('l','L',1)) # 将第一個字元換成第二個字元第三參數為替換幾個預設為全部替換

'MonkeyLi'

>>>'1+2+3+4'.split('+') # 将字元串按照’元素‘分割成一個清單

['1','2','3','4']

>>>'MonkeyLi'.swapcase() # 交換空間,将大寫轉化成小寫小寫轉大寫

'mONKEYlI'

>>>'JIAJIA’.zfill(50) # 不夠的位數填零

000000000000000000000000000000000000000000000JIAJIA

List(清單)

清單簡述

list.__doc__():

Built-in mutable sequence.

If no argument is given, the constructor creates a new empty list.

The argument must be an iterable if specified.

清單是一個容器類型的可變類型,其中存放的是對象的引用而不是對象本身。當通過索引給清單指派時隻是講對象的引用放入清單中對應的位置。

>>> name = 'monkey'

>>> l = [name]

>>> l[0] = 'Mike'

>>> l

['Mike']

>>> l[0]

'Mike'

清單的索引和切片

清單的索引和切片同String類型一模一樣,在Python中 所有的索引和切片操作隻要是被支援的,那麼都和字元串一模一樣。

清單的常用方法

#!/usr/bin/env python3#_*_ coding: utf-8 _*_

__author__ = "monkey"test_list1= list(range(0,10,2))

test_list2= list(range(1,10,2))#清單的增加

test_list2.append(7)#From documents" Append object to the end of the list."

test_list2.insert(111,'inser_value')#如果 輸入的 index 值超過了清單本身 index的最大值 就把value 添加到最後#如果 輸入的 index 值超過了清單本身 index的最小值 就把value 添加到最前面

test_list1.extend(test_list2)#From documents " Extend list by appending elements from the iterable. "#清單的删除

test_list1.remove(1)#From documents "Remove first occurrence of value."#删除 給定的元素#如果删除的元素不存在清單中 将會報 ValueError#如果删除的元素在清單裡由多個值,将會删除第一個比對到的值#ValueError: list.remove(x): x not in list

tmp = test_list1.pop(2)#pop()方法将會傳回被删除元素的 值 (接受一個index 删除這個元素,并傳回這個元素!)#pop()方法 接受一個 index值 如果這個index不存在,将會抛出IndexError#删除index指向的值 預設為 -1 即預設的删除最後一個元素#From documents:Raises IndexError if list is empty or index is out of range.

test_list1.clear()#From documents " Remove all items from list. "#clear 方法将會徹底的清空清單,不會删除這個清單 差別于del方法 清除掉的是對象的資料 而不是對象的引用#del test_list1#将會徹底的删除list 變量名的引用 不同于C的free 和 C++的delete 不會釋放掉記憶體,#而是解除了變量名"test_list1"對 list(range(0,10,2))對象的引用 并不是删除了對象#list(range(0,10,2)) 對象仍然存在!例如 a = 1 c = a del a print(c) 仍然能#輸出1 但是print(a)會報錯:NameError: name 'a' is not defined#這是引用被删除,而不是引用的對象本身被删除#del test_list1[1]#del 不是list的專有的方法,但是能實作list的删除操作!#此時del删除的是#清單的修改

test_list2[2] = 'new_value'

#其他操作

test = test_list2.count(7)test = test_list2.index(7)#From documents " Return number of occurrences of value. "#-*-排序

test = [1,234,45,2,66,92]

test.sort()#sort 方法按照ASCII碼順序進行排序:特殊字元>數字>大寫>小寫>#sort 方法 要求清單中的元素類型必須一緻#sort 方法的排序是清單本身 無傳回值#-*-反轉

test.reverse()#reverse 方法是在原記憶體上修改的,而不是建立一個新的對象,即無傳回值

三元運算和清單生成式

三元運算

a = 2

b = 4

>>>max = a if a>b else b # 經典三元表達式a b 比大小

>>>max

4

c = 6

>>>max = (a if a>b else b) if (a if a>b else b)>c else c # a b c 三個數比大小

>>>max

6

# 三元表達式用來 過濾資料 保護程式的穩定性

# 傳回參數中所有數字或看起來像數字的和

def func(*args):

return sum(int(tmp) if type(tmp) is int or tmp.isdigit() and int(tmp) else 0 for tmp in args)

>>>func(1,'w3e','1',2,3,'24sdfsd','sfdsfsd'))

7

清單生成式

>>>num_list = [random.randint(1,20) for i in range(10)] # 生成一個包含10個随機數的清單

>>>num_list

[10, 8, 1, 7, 17, 16, 19, 7, 2, 13]

>>>["Element:{}".format(i) for i in num_list] # 生成20個“Elemen?”的清單

['Element:10', 'Element:8', 'Element:1', 'Element:7', 'Element:17', 'Element:16', 'Element:19', 'Element:7', 'Element:2', 'Element:13']

>>>["AU{}".format(i) for i in num_list if i%2==0] # 帶過濾器的生成式

['AU10', 'AU8', 'AU16', 'AU2']

def deal(x):

if x>10 and x%2==0:

return True

>>>["func{}".format(i) for i in num_list if deal(i)] # 帶邏輯函數的生成式

['func16']

Tuple(元組 )

元組簡述

tuple.__doc__:

tuple() -> empty tuple

tuple(iterable) -> tuple initialized from iterable's items

If the argument is a tuple, the return value is the same object.

元組雖然說是隻讀清單,但是元組的操作還是很多的,例如 元組支援 + 運算(調用__add__方法)

元組也是一個容器對象

元組中每個元素都是具體的對象,或引用時對象和引用本身不可更改,但是 可以對元組元素 引用的對象 進行更改,進而 達成修改元組的目的

元組本身支援索引、切片、指派

元組的常用方法

# 單純的一個括号 就是一個 空的元組對象

>>>type(())

test_tuple = ('name',1,'age',2,1)

# 元組 除魔術方法外 隻有兩個方法 index 和 counts

# index

# 對象不存在就會報錯

>>>test_tuple.index(2,3)

3

# index方法最多可以接受三個參數 第一個為對象 第二個為 開始的索引值 第三個為 結束的索引值

>>>test_tuple.count(1) # 對象不存在 傳回0

2

#tuple.__add__()

>>>new_tuple = 1,1,1,1

>>>new_tuple_add = new_tuple.__add__(test_tuple)

>>>new_tuple_add

(1, 1, 1, 1, 'name', 1, 'age', 2, 1)

>>>lst= [1,2,3]

>>>mytuple=(1,2,lst)

>>>mytuple[2][0] = 'new_element’

>>>mytuple

(1, 2, ['new_element', 2, 3])

# 元組也是一個容器對象,當元組中的元素是一個可變對象的引用時,可以通過元組來更改這個可變對象。

# 元組的概念很簡單,多是用來承接多個對象時候使用

# Python的傳回值支援多傳回,多指派,就是借助于 元組 實作的

test = a,b,c = 1,2,3

print(test)

print('(a,b,c):',id((a,b,c)))

print('test:',id(test))

print('a:',id(a))

print('b:',id(b))

print('c:',id(c))

print('1:',id(1))

print('2:',id(2))

print('3:',id(3))

# 觀察 記憶體位址

# test = a,b,c = 1,2,3

# 将 a,b,c 組成元組 并被 test引用,而後,a,b,c 分别成為對象1 ,2 ,3 的引用

Set(集合)

集合的概述

set.__doc__:

set() -> new empty set object

set(iterable) -> new set object

Build an unordered collection of unique elements.

集合(set)是一個無序的不重複元素序列,是以它不支援索引和切片操作。

可以使用大括号 { } 或者 set() 函數建立集合。

集合多用來做去重操作

注意:建立一個空集合必須用set() 而不是 { },因為 { } 是用來建立一個空字典。

集合的常用方法

>>> lst = ['new_element', 2, 3]

>>> myset = set()

>>> myset.add('Python') # 如果元素已存在,則不進行任何操作。添加一個元素

>>> myset

{'Python'}

>>> myset.update(lst) # 參數可以是清單,元組,字典等 可以用一次添加多個元素(先被打散,然後添加)當字典被傳入時,預設的隻添加字典的鍵!而不會添加值

>>> myset

{3, 'new_element', 'Python', 2}

>>> myset.update({'name':18}) # 同時 可以接受多個參數 用 逗号 分割

>>> myset

{3, 'new_element','name’, 'Python', 2}

>>> myset.remove('name') # 元素存在就删除 不存在就 報錯 錯誤類型 “KeyError”

>>> myset

{'new_element', 2, 3, 'Python'}

>>> myset.discard('test') # 删除元素,不存在 不報錯

>>> myset

{'new_element', 2, 3, 'Python'}

>>> myset.pop() # 随機的删除一個元素 并且将這個元素傳回 (互動模式下 總是删除第一個元素)

'new_element'

>>> myset

{2, 3, 'Python'}

>>> myset.clear() # 清空集合

>>>myset

set()

集合中的幾個注意:

當建立集合時 :

myset = set(('Python'))  ---> 建立的是 {'Python'}

myset = set('Python')  ---> 建立的是 {'o','n','t','y','P','h'} 而不是 期望的 {'Python'}

添加元素時:

set() s.update( {"C++"} ) 将字元串添加到集合中,有重複的會忽略

set() s.update("C++") 會将"C++"打散加入集合 得到的将不是期望的 将 "C++" 添加進集合

關于pop操作 當集合為list轉化而來 每次pop都是首元素 (這樣的觀點是不正确的)

下面是一個驗證代碼

#!/usr/bin/env python3

# _*_ coding: utf-8 _*_

__author__ = "monkey"

import random

def test_func():

lst = [random.randint(1, 20) for i in range(20)]

myset = set(lst)

if lst[0] == myset.pop():

return True

return False

flag = True

while test_func():

pass

print("循環結束,pop()方法是随機的!")

集合的運算