02_python基础_变量

本文档目标:掌握常见变量的基本操作及各变量间转换

变量定义

变量为存储在内存中的值,用于程序临时保存数据使用。

变量包括名称、值、变量类型、内存地址等信息

a_int = 1
#变量赋值,python中变量不需要定义
#变量名称建议使用多个小写单词并以_连接
#变量名称不能与方法、关键字重复。比如不能命名为int,否则将导致使用int()时报错

print(a_int)
#打印变量的值

print(type(a_int))
#打印变量类型

print(id(a_int))
#打印变量的内存地址

变量输入输出

>>> a=input("input a number:")
input a number:123
#用input()函数获取输入的变量,可以可添加输入提醒

>>> print(a,type(a))
123 <class 'str'>
#输出使用print()
#所有的输入都是str,若程序需要的是其他类型的则需要进行转换

数字类型变量

主要介绍可用于存储数字的五种数据类型及这五种数据类型之间相互转换

整数型(int)、浮点型(float)、复数(complex)、字符串(str)与字节串(bytes)

1 赋值

>>> a_int=-12
>>> print(a_int,type(a_int),id(a_int))
-12 <class 'int'> 139792076681936
#int型赋值,赋值时变量名不能命名为int,否则将在后续演示调用int()时报错

>>> a_float=-12.9
>>> print(a_float,type(a_float),id(a_float))
-12.9 <class 'float'> 139792100565424
#float型赋值

>>> a_bytes=b'-2'
>>> print(a_bytes,type(a_bytes),id(a_bytes))
b'-2' <class 'bytes'> 139792076676392
#bytes型赋值
#bytes型支持保存字符串、数字、图片、音频等信息,这边为方便演示转换以-2举例

>>> a_complex=1+2j
>>> print(a_complex,type(a_complex),id(a_complex))
(1+2j) <class 'complex'> 2150393716528
#complex型赋值

>>> a_str='-12.9'
>>> print(a_str,type(a_str),id(a_str))
-12.9 <class 'str'> 2150395477272
#str型赋值,可采用如下四种方式赋值:'值'、‘’‘值’‘’、“值”、“”“值”“”

2 数字类型互相转换

int float str bytes complex
int float(a_int) str(a_int) a_int.to_bytes(4, byteorder='little', signed=True) complex(a_int)
float int(a_float) str(a_float) 不支持 complex(a.float)
str int(a_str) float(a_str) a_str.encode() complex(a_str)
bytes int(a_bytes) float(a_bytes) a_bytes.decode() 不支持
complex int(a_complex.real) a_complex.real str(a_complex) 不支持

complex不能直接转为int和float,但是可以通过real函数提取出实数部分

2.1 int

支持转为int型的仅有float、str、bytes,其他类型均不支持

complex虽然不能直接转为int,但是可提取出实数部分转为int型

>>> print(a_float,int(a_float),type(a_float))
-12.9 -12 <class 'float'>
#float-->int,会去掉小数点及后面的数值,仅保留整数部分

>>> print(b_str,type(b_str),int(b_str),type(int(b_str)))
-12 <class 'str'> -12 <class 'int'>
#str-->int,若字符串中有数字(0-9)和正负号(+/-)以外的字符,就会报错(包括小数点)

>>> print(a_bytes,int(a_bytes),type(int(a_bytes)))
b'-2' -2 <class 'int'>
#bytes-->int,若字节串中有数字(0-9)和正负号(+/-)以外的字符,就会报错(包括小数点)

>>> print(a_complex,int(a_complex.real),type(int(a_complex.real)))
(1+2j) 1 <class 'int'>
#complex-->int,由于直接舍弃虚数部分,不能认为是转换,仅适用于特定场合下。
#虚部获取可用a_complex.imag

2.2 float

支持转为float型的仅有int、str、bytes,其他类型均不支持

complex虽然不能直接转为floaat,但是可提取出实数部分转为float型

>>> print(a_int,float(a_int),type(float(a_int)))
-12 -12.0 <class 'float'>
#int-->float,会自动添加一位小数

>>> print(a_str,float(a_str),type(float(a_str)))
-012.1 -12.1 <class 'float'>
#str-->float,若字符串中有数字(0-9)、小数点(.)和正负号(+/-)以外的字符,就会报错

>>> print(a_bytes,float(a_bytes),type(float(a_bytes)))
b'-2' -2.0 <class 'float'>
#bytes-->float,若字节串中有数字(0-9)、小数点(.)和正负号(+/-)以外的字符,就会报错

>>> print(a_bytes,str(a_bytes),type(str(a_bytes)))
b'hello world' b'hello world' <class 'str'>
>>> print(a_bytes,str(a_bytes,encoding='utf-8'),type(str(a_bytes,encoding='utf-8')))
b'hello world' hello world <class 'str'>
>>> print(a_bytes,str(a_bytes.decode()),type(str(a_bytes.decode())))
b'hello world' hello world <class 'str'>
#bytes-->str,直接使用str()将进行完全转换;若使用bytes.decode()或str()指定encoding将转换为实际的值

>>> print(a_complex,a_complex.real,type(a_complex.real))
(1+2j) 1.0 <class 'float'>
#complex-->float,由于直接舍弃虚数部分,不能认为是转换,仅适用于特定场合下。
#虚部获取可用a_complex.imag

2.3 str

任意对象都能转成字符串

>>> print(a_int,str(a_int),type(str(a_int)))
-12 -12 <class 'str'>
#int-->str,直接完全转换

>>> print(a_float,str(a_float),type(str(a_float)))
-12.9 -12.9 <class 'str'>
#float-->str,转成字符串会去掉末尾为0的小数部分

>>> a_complex=complex(1,2)
>>> print(a_complex,str(a_complex),type(str(a_complex)))
(1+2j) (1+2j) <class 'str'>
#complex-->str,会先转成标准complex表达式,再转成字符串

2.4 bytes

支持int、str转为bytes

>>> print(a_int,a_int.to_bytes(2,byteorder='little',signed=True),type(a_int.to_bytes(2,byteorder='little',signed=True)))
-12 b'\xf4\xff' <class 'bytes'>
#int-->bytes,2为字节串长度;byteorder为字节顺序;signed表示是否使用补码,若该值为False且int为负数将报错

>>> a_str='中国'
>>> print(a_str,a_str.encode(),type(a_str.encode()))
中国 b'\xe4\xb8\xad\xe5\x9b\xbd' <class 'bytes'>
>>> print(a_str,bytes(a_str,encoding='utf-8'),type(bytes(a_str,encoding='utf-8')))
中国 b'\xe4\xb8\xad\xe5\x9b\xbd' <class 'bytes'>
#str-->bytes,支持以上两种方式

2.5 complex

仅支持int、float、str转换为complex类型

>>> print(a_int,complex(a_int),type(complex(a_int)))
-12 (-12+0j) <class 'complex'>
#int-->complex,自动添加虚部并以0j表示

>>> print(a_float,complex(a_float),type(complex(a_float)))
-12.9 (-12.9+0j) <class 'complex'>
#float-->complex,自动添加虚部并以0j表示

>>> print(a_str,complex(a_str),type(complex(a_str)))
-012.1 (-12.1+0j) <class 'complex'>
>>> print(a_str,complex(a_str),type(complex(a_str)))
-1+2j (-1+2j) <class 'complex'>
#str-->complex,分两种情况:1、能转成int、flost,先转换成int或float再转成complex;2、符合complex表达式(第二个符号前后不能空格)直接转成complex

序列类型变量

序列类型主要包括列表(list)、元组(tuple)、字典(dict)、集合(set)

本章节主要介绍这四种序列类型的差异及互相转换

1 序列类型比较

1.2 元素比较

内容 是否可修改 是否有序 是否可重复
list 任意
tuple 任意
dict 键值对
set 任意

1.2 变量定义

直接赋值 赋空值 函数赋值
list a_list=['1','a'] b_list=[] c_list=list(seq)
tuple a_tuple=(1,2,'3') b_tuple=() c_tuple=tuple(seq)
dict a_dict={'name':'lin'} b_dict={} c_dict=dict.fromkeys(seq,val=None)
#val=None用于设置默认值,默认为None
set a_set={1,2,3} b_set=set() c_set=set(seq)
d_set=forzenset(set)
#forzenset用于创建固定集合,该类型集合不可修改

备注1:seq指序列类型,包括list、tuple、dict、set、str(字符串可以认为是特殊的元组)

2 基本操作(增删改查)

2.1 list

========增=========
a_list.append(3)
#在末尾追加
a_list.insert(3,'a')
#在指定位置插入
a_list.extend(b_list)
#将列表b_list中的元素添加到a_list后面

========删=========
a_list.remove(3)
#删除第一个匹配项,若元素不存在则报错
a_list.pop()
#删除最后一个元素并返回该元素

========改=========
a_list[2]=12
#单元素修改
a_list[2:3]=[12,13]
#多元素修改
a_list.sor(reverse=True)
#a_list进行排序处理,不返回内容,reverse设置为True表示倒序,False为正序
sorted(a_list,reverse=False)
#对a_list进行排序处理并返回结果,reverse设置为True表示倒序,False为正序

========查=========
a_list.index(1)
#获取指定元素第一次出现的位置
1 in a_list
#判断指定元素是否在a_list中
a_list.count(3)
#计算a_list中指定元素出现的次数

2.2 tuple

========增=========
不可新增

========删=========
del a_tuple
#删除整个元组,而非删除元组中元素

========改=========
#不可修改

========查=========
a_tuple[0]
#获取指定元素
a_tuple[1:3]
#获取指定范围的元素,获取的结果依旧是元组
max(a_tuple)
#获取元组中的最大值,只支持同类型比较
min(a_tuple)
#获取元组中的最小值,只支持同类型比较
1 in a_tuple
#判断元素是否在元组中

2.3 dict

========增=========
a_dict.setdefault('name','lin')
#若键不存在字典中,则新增键值对;否则返回对应的值
a_dict.update(b_dict)
#将字典b_dict中的键值对添加到a_dict中

========删=========
a_dict.pop(3)
#删除指定键值对并返回;若不存在则报错
a_dict.popitem()
#随机删除键值对,并返回
del a_dict[3]
#删除指定键值对无返回;若不存在则报错
a_dict.clear
#清空字典中所有元素

========改=========
dict['name']='Lin' 
#修改某个键值对的值

========查=========
dict1['name'] 
#查询某个键值对的值,若不存在则报错
dict2.get('name',0)
#查询某个键值对的值,若不存在则返回默认值
’name‘ in dict3.keys()
#查询某个键是否存在

2.4 set

========增=========
a_set.add('1')
#添加元素
a_set.update(b_set)
#将集合b_set中的元素添加到集合a_set

========删=========
a_set.discard(6)
#删除指定元素,元素不存在不报错
a_set.remove(6)
#删除指定元素,元素不存在则报错
a_set.pop()
#随机删除一个元素并返回
a_set.clear()
#清空集合

========改=========
a_set.intersection_update(b_set)
#将a_set与b_set的并集赋值给a_set
a_set.difference_update(b_set)
#将a_set与b_set的差集赋值给a_set
set1.symmetric_difference_update(set2)
#获取a_set与b_set的对称差集赋值给a_set

========查=========
x in a_set
#判断元素是否在集合a_set中
a_set.issubset(b_set)
#判断a_set是否是b_set的子集,超集则是issuperset
a_set.union(b_set)
#获取a_set和b_set的并集,不影响a_set与b_set,类似的还有differenct(差)、intersection(交)、symmetric_defference(对称差)

3 序列类型转换

str list tuple dict set
str list(a_str) tuple(a_str) ast.literal_eval(a_str) set(a_str)
list str(a_list)
a_str.join(a_list)
tuple(a_list) dict(zip(a_list,b_list)) set(a_list)
tuple str(a_tuple)
a_str.join(a_tuple)
list(a_tuple) dict(zip(a_tuple,b_tuple)) set(a_tuple)
dict str(a_dict)
a_str.join(a_dict)
list(a_dict) tuple(a_dict) set(a_dict)
set str(a_list)
a_str.join(a_dict)
list(a_set) tuple(a_set) dict(zip(a_set,b_set))

a_str.join(seq),只适用于元素为字符串,a_str用于保存拼接之后的字符串

3.1 str

>>> print(a_list,type(a_list),str(a_list),type(str(a_list)))
[1, 2, 3, 4, 5] <class 'list'> [1, 2, 3, 4, 5] <class 'str'>
#seq->str:会先将值转为标准的seq表达式(包括list、tuple、dict、set),然后直接转为字符串

>>> a_list
['1', '2', '3']
>>> a_str=''
>>> a_str.join(a_list)
'123'
#a_str.join(seq):当元素为字符串时可以将元素合并并赋值给a_str

3.2 list

>>> print(a_str,list(a_str))
12345 ['1', '2', '3', '4', '5']
#str->list:将每个字符转为list中的元素

>>> list(b'hello')
[104, 101, 108, 108, 111]
#bytes->list:取每个字节的ASCII十进制值并组合成列表。

>>> print(a_tuple,list(a_tuple))
(1, 2, 3) [1, 2, 3]
#tuple->list:元组中每个元素转换为列表中的元素

>>> print(a_dict,list(a_dict))
{'name': 'lin', 'sex': 'man'} ['name', 'sex']
#dict->list:取字典中每个键值对的键做为列表中的元素

>>> a_set={1,2,3,4,4,4,4,4}
>>> print(a_set,list(a_set))
{1, 2, 3, 4} [1, 2, 3, 4]
#set->list:先去重再转成列表。由于集合不可重复,去重在赋值时已完成

3.3 tuple

>>> print(a_str,tuple(a_str))
123456 ('1', '2', '3', '4', '5', '6')
#str->tuple:将每个字符转换成元组中的元素

>>> print(a_list,tuple(a_list))
['1', '2', '3'] ('1', '2', '3')
#list->tuple:将list中的元组转成元组中的元素

>>> print(a_dict,tuple(a_dict))
{'name': 'lin', 'sex': 'man'} ('name', 'sex')
#dict->tuple:将字典键值对中的键转成元组中的元素

>>> a_set={1,2,3,4,4,4,4,4}
>>> print(a_set,tuple(a_set))
{1, 2, 3, 4} (1, 2, 3, 4)
set->tuple:集合去重之后转成元组中的元素。由于集合不可重复,去重在赋值时已完成

3.4 dict

>>> a_str="{'name':'lin','age':12}"
>>> import ast
>>> ast.literal_eval(a_str)
{'name': 'lin', 'age': 12}
#str->dict:若使用json需确保所有的键值都用单引号包围、若使用eval则会执行任何符合语法的表达式字符串,存在安全隐患

>>> print(a_list,b_list,dict(zip(a_list,b_list)))
['name', 'age'] ['lin', 12, 'man'] {'name': 'lin', 'age': 12}
#list->dict:合并两组列表作为字典;第一组为键,第二组为值;若键重复则后面的覆盖前面的。
    若list中的元素为两个元素的list,则可以直接使用dict(list)进行转换
    
>>> print(a_tuple,b_tuple,dict(zip(a_tuple,b_tuple)))
('name', 'age') ('lin', 12, 'man') {'name': 'lin', 'age': 12}   
tuple->dict#合并两组元组作为字典;第一组为键,第二组为值;若键重复则后面的覆盖前面的。
        若元组中的元素为两个元素的元组,则可以直接使用dict(tp)进行转换
   
>>> print(a_set,b_set,dict(zip(a_set,b_set)))
{'name', 'age'} {12, 'lin', 'man'} {'name': 12, 'age': 'lin'}
#set->dict:合并两个集合作为字典,第一组为键,第二组为值

3.5 set

>>> print(a_str,set(a_str))
123133 {'1', '2', '3'}
#str->set:先将字符切割成元组,然后去重转换为集合

>>> print(a_list,set(a_list))
[1, 2, 1, 2, 1, 2] {1, 2}
#list->set:先对列表去重,然后转换为集合

>>> print(a_tuple,set(a_tuple))
(1, 2, 1, 2, 1, 2) {1, 2}
#tuple->set:先对元组去重,然后转换为集合

>>> print(a_dict,set(a_dict))
{'name': 'lin', 'xb': 'boy'} {'name', 'xb'}
#dict->set:取字典的键名组合成集合
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,992评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,212评论 3 388
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,535评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,197评论 1 287
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,310评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,383评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,409评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,191评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,621评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,910评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,084评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,763评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,403评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,083评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,318评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,946评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,967评论 2 351

推荐阅读更多精彩内容