Python基础(1)——变量和数据类型[xiaoshun]

目录

 

一、变量

1.概述

Variables are used to store information to be referenced(引用)and manipulated(操作) in a computer program.

2.声明

 (1)命名规则

  • 变量名只能是字母、数字或下划线的任意组合;
  • 第一个不能是数字
  • 关键字不能作为变量名

 (2)定义

name1 = 'Lu'
name2 = name1
name1 = 'MJJ'
print(name1, name2)

-->:
MJJ Lu

 (3)删除

name1 = 'Lu'
del name1
print(name1)

-->:
NameError: name 'name1' is not defined

 变量的生命周期:无指向时,才会在内存中被回收。

二、数据类型

1.数字

 (1)分类

Python 支持三种不同的数值类型:

  • 整型(Int) : 不带小数点。Python3 整型是没有限制大小的,可以当作   Long 类型使用,Python3 没有 Python2 的 Long 类型;
  • 浮点型(float):浮点型由整数部分与小数部分组成,浮点型也可以使用科学计数法表示(2.5e2 = 2.5 x 102 = 250);
  • 复数( (complex)) - 复数由实数部分和虚数部分构成,可以用a + bj,或者complex(a,b)表示, 复数的实部a和虚部b都是浮点型。

 (2)类型转换

  • int(x) 将x转换为一个整数。
  • float(x) 将x转换到一个浮点数。
  • complex(x) 将x转换到一个复数,实数部分为 x,虚数部分为 0。
  • complex(x, y) 将 x 和 y 转换到一个复数,实数部分为 x,虚数部分为 y。x 和 y 是数字表达式。Python中复数不支持强转,但可以通过real和image方法获取到实部和虚部的值。

 (3)运算

不同类型的数混合运算时会将整数转换为浮点数。

  • /:总是返回一个浮点数。
  • //:得到的并不一定是整数类型的数,它与分母分子的数据类型有关系。

          7 // 2=3, 7.0 // 2=3.0,7 // 2.0=3.0

  • **:幂运算。
  • %:取余。

在交互模式中,最后被输出的表达式结果被赋值给变量 "_"。“_”应该为只读变量。

 (4)数学函数

  • abs(x):返回数字的绝对值,如abs(-10) 返回 10。
  • max(x1, x2,...) :返回给定参数的最大值,参数可以为序列。
  • min(x1, x2,...) :返回给定参数的最小值,参数可以为序列。
  • pow(x, y):x**y 运算后的值。
  • sqrt(x) :返回数字x的平方根。

 (5)随机数函数

2.字符串

(1)切片,索引,拼接

str[a:b],str[a:b:c]

  • a,b为参数。从字符串指针为a的地方开始截取字符,到b的前一个位置(因为不包含b);
  • 如果a,b均不填写,默认取全部字符;
  • 如果a填写,b不填写(或填写的值大于指针下标),默认从a开始截取,至字符串最后一个位置;
  • 如果a不填写, b填写,默认从0位置开始截取,至b的前一个位置;
  • 如果a为负数,默认从尾部某一位置,开始向后截取,最后一个位置为-1
  • 如果a>=b, 默认输出为空。
  • [a:b:c] 表示的是从头到尾,步长为c。第一个冒号两侧的数字是指截取字符串的范围,第二个冒号后面是指截取的步长。
  • [::-1]:字符串倒序

万恶的字符串拼接:

  python中的字符串在C语言中体现为是一个字符数组,每次创建字符串时候需要在内存中开辟一块连续的空,并且一旦需要修改字符串的话,就需要再次开辟空间,万恶的+号每出现一次就会在内从中重新开辟一块空间。

字符串是一种不可变数据类型,不可以改变。可以用截取的方式,拼接的方式重新组合成新的字符串。

           str1[0] = "H"

           TypeError: 'str' object does not support item assignment.

(2)转义

  • \(在行尾时):续行符。代码过长时,可以用续航符进行换行编写,且续行符之后,续行符后面什么都不能 出现(包括空格),必须换行(必须换行写内容)

        a = "ajkfhajkfhkjahfkahfkhakfhkdafafafaddafafdafafadfafafafafafadefgg" \

          "hfakjfhkah"

  • \\ 反斜杠符号,\' 单引号,\" 双引号:

        print(str1 + "\\")print("\'" + str1 + "\'")

  • \a 响铃,命令行交互模式中可以实现。
  • \b 退格(Backspace),\000 空,\n 换行,等

(3)运算

  • “+”:拼接
  • “str*number”:重复输出number次str
  • []:获取索引
  • [:]:截取,切片,左闭右开
  • in,not in :成员逻辑运算符
  • R/r:原始字符串 - 原始字符串:所有的字符串都是直接按照字面的意思来使用,没有转义特殊或不能打印的字符,引入文件路径时常用。

        print(r"hello \' word!")

        print("hello \' word!")

(4)格式化输出

  %和format()函数使用、f-string字面量格式化字符串,是新的格式化字符串的语法。

(5)字符串操作

  • str.capitalize(),无参数,将字符串的第一个字符转换为大写,其余转换成小写。首字符为非字母,则不转换,其余转为小写。
  • str.center(width[, fillchar]),返回一个指定宽度且原str居中的新字符串,fillchar 为填充的单个字符,默认为空格。

    参数:width,宽度;fillchar,能且只能为一个字符。

    注意:

      a、如果 width 小于字符串宽度直接返回字符串,不会截断;

      b、fillchar 只能是单个字符。

  • str.count(sub[, start= 0][,end=len(string)]),统计子字符串sub里某个字符串出现的次数。可选参数为在字符串搜索的开始(默认为0)与结束位置(默认为len(string))。
str1 ='python' * 3
print(str1.count('p'))
print(str1.count('p', 1))   # 包含起始位置
print(str1.count('p', 1, -6))   # 不包含结束位置

-->:
3
2
1

  

  • str.join(sequence),将序列seq中的元素以指定的字符串str连接返回一个新的字符串。

    参数:seq,元组、列表、字典、字符串。字典只能连接键值key。

str1 = '\t'
str2 = 'python'
list1 = [i*2 for i in str2]
print(str1.join(str2))
print(str1.join(list1))

-->:
p	y	t	h	o	n
pp	yy	tt	hh	oo	nn

  

  • str.split(str="", num=string.count(str)),指定分隔符对字符串进行切片。常用作数据的分析提取。

    参数:str,分隔符,默认为所有的空字符,包括空格、换行(\n)、制表符(\t)等;num,分割次数。默认为 -1, 即分隔所有,分割为 num+1 个子字符串。

    返回值:元素为字符串的列表。

      爬虫时,图片名获取:

url_str = "http://www.baidu.com/python/image/123456.jpg"
print(url_str.split('/')[-1])

-->:
123456.jpg

  

  • str.strip([chars]),移除字符串头尾指定的字符(默认为空格)或字符序列chars,返回新字符串。

    注意:

      a、该方法只能删除开头或是结尾的字符,不能删除中间部分的字符。

      b、如果不带参数,默认是清除两边的空白符,例如:/n, /r, /t, ' '等

str1 = '\tpython\t' * 3
print(str1.strip())

-->:
python		python		python

  

      c、带有参数的时候,这个参数可以理解一个要删除的字符的列表,删除多个字符时,只要头尾有对应其中的某个字符即 删除,不考虑顺序,直到遇到第一个不包含在其中的字符为止。

str1 = 'a111123\t132231b213321312==3213122132*31123132'
print(str1.strip('123ab\t'))
# 等价于
for i in str1:
    if i in '123ab\t':
        str1 = str1.strip(i)

-->:
==3213122132*

  

  • (待补充)

3.列表

(1)基况

  列表元素类型可以不一致,和C数组不一样(类似ndarray)。列表元素可以修改,所以做列表有关操作时,要注意原列表的元素是否被更改了(深浅拷贝!!!)。

list1 = [i for i in range(10)]
list2 = list1    # list2 = list1.copy()
print(list1, list2)
list2[0] = 100
print(list1, list2)

-->:
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9] [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
[100, 1, 2, 3, 4, 5, 6, 7, 8, 9] [100, 1, 2, 3, 4, 5, 6, 7, 8, 9]

(2)基操

  • 下标索引查找或者更改(列表可变)
  • 截取、切片:[:];间隔截取:[:::]
  • 拼接组合:“+”;重复:“*”
  • 成员逻辑判断:in;not in

(3)列表嵌套

不支持花切,只能分层操作。

list1 = [
    [1, 2, 3],
    [4, 5, 6],
    [7, 8, 9]
]
print(list1[1:][:])
print(list1[[0], [0]])

-->:
TypeError: list indices must be integers or slices, not tuple
[[4, 5, 6], [7, 8, 9]]

(4)常见内建函数和列表方法

内建函数:

  • len(list),返回列表元素个数
  • min/max(list),返回列表最小值/最大值

    元素全部为数字类型时,直接根据值的大小比较。当其中的元素全部为字符串类型(string)时,则比较的是每个字符串元素的第一个字符的 ASCII 的大小。

  • list(seq),将元组或字符串转换成列表。
str1 = "python"
tup1 = ('1', '2', '3')
dict1 = {'a': 1, 'b': 2, 'c': 3}
print(list(str1))    # 每个字符循环一遍,类似列表生成式
print(list(tup1))
print(list(dict1))    # 默认为KEY
print(list(dict1.values()))

-->:
['p', 'y', 't', 'h', 'o', 'n']
['1', '2', '3']
['a', 'b', 'c']
[1, 2, 3]
  • enumerate(list),以(index, value)小元组形式返回列表的下标和下标对应的值。
list1 = [i for i in range(10)]
for index, value in enumerate(list1):
    print(index, value)

-->:
0 0
1 1
2 2
3 3
4 4
5 5
6 6
7 7
8 8
9 9
  • 待补充

list对象的方法:

  • list.append(obj),在列表末尾添加新的对象,返回值为None,修改原列表。假若不希望原列表被改,记得先copy()。
list1 = [i for i in range(10)]
list2 = list1.append(10)
print(list2, type(list2), list1)

-->:
None <class 'NoneType'> [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
  • list.count(obj),返回某个元素在列表中出现的次数。不可以像str.count()指定搜索区间,搜索整个列表。
  • list.extend(seq),在列表末尾一次性追加另一个序列中的多个值(用新列表扩展原来的列表),无返回值。list.append()的循环加强版。

   参数:
    seq-- 可以是列表、元组、集合、字典,若为字典,则仅会将键(key)作为元素依次添加至原列表的末尾。

  • list.index(x[, start[, end]]),返回X在列表中第一次匹配到的索引。如果没找到,则抛出异常!

    参数:
    x-- 查找的对象。
    start-- 可选,查找的起始位置。
    end-- 可选,查找的结束位置。

  • list.insert(index, obj),将指定对象插入列表的指定位置,无返回值,在原列表操作修改。
  • list.pop([index=-1]),移除列表中的一个元素(默认最后一个元素,不能超过len(list),否则抛异常!),并且返回该元素的值。在原列表操作删除。
  • list.remove(obj),移除列表中某个值的第一个匹配项,无返回值。在原列表操作删除。无法指定匹配区间。

    删除重复元素,不要用由前到后for循环。因为删除一个后,后面的元素回向前补齐,而循环下标还是会正常加1,会导致后面的循环下标与元素不对应。
      方法一:从后往前[::-1]循环开始删除。


      方法二:用Python原生态方法,现用set()列表变成集合(集合唯一性),再用list()将集合变成列表。

list1 = [1, 2, 'a', 'l', 'a', 1, 1, 2, 3]
set1 = set(list1)
list1 = list(set1)
print(list1)

-->:
[1, 2, 3, 'l', 'a']

  

  • ist.reverse(),翻转180°,无返回值。
  • list.sort( key=None, reverse=False),排序。无返回值,原列表操作。默认reverse=False升序。
  • 待补充

4.元组

(1)基况

  与列表类似,但元素不能修改,又叫只读列表。和str一样,操作都会生成新的元组。

(2)基操

  • 下标索引访问查找
  • 截取、切片、间隔截取[:::]访问
  • 拼接组合:“+”;重复:“*”
  • 成员逻辑判断:in;not in

(3)常见内建函数及方法

函数:

  • len()、max()、min()
  • tuple(iterable):将可迭代系列转换为元组。

方法:(只有两个,因为元组不可变)

  • count()
  • index()

(4)元组注意事项

  a、元组中只包含一个元素时,需要在元素后面添加逗号,否则括号会被当作运算符使用:

Tuple1 =(3)--》<class 'int'>Tuple = (3,)--》<class 'tuple'>

  b、tuple的元素值是不允许删除的,但我们可以使用del语句来删除整个元组。

  c、tuple中的“不变”,指的是“指向不变”,但是指向里面的内容是可以变的。

tuple1 = ([1, 2, 3, 9, 5], [1, 1, 2, 3], 100)
tuple1[0][0] = 100
print(tuple1)

-->:
([100, 2, 3, 9, 5], [1, 1, 2, 3], 100)

5.字典

(1)基况

  字典是另一种可变容器模型,且可存储任意类型对象。key-value键值对形式。

(2)键和值

  • 键值必须唯一,值不必,但同一个键值被赋值两次,后一次赋值会被记住;
  • 值可以是任何数据类型(标准的、用户自定义的),但键值必须是不可变的数据类型:字符串、元组、数字;
  • 对字典操作,一般通过键值(特殊的索引)进行操作:读取、修改、新增、删除等
  • 通过键值对字典进行逻辑操作:key in/not in dict

(3)常见内建函数和方法

 函数:

  • len(dict),计算字典元素个数,即键的总数。

方法:

  • dict.clear(),清空字典内所有元素,字典不会被删除,无返回值无参数。
  • dict.copy(),返回一个字典的浅拷贝。
dict1 = {'name': ['lu', 'mjj'], 'age': [18, 16], 'sex': ['man', 'wom']}
dict2 = dict1.copy()        # 深拷贝父对象(一级目录),子对象(二级目录)不拷贝,还是引用
dict2['name'][0] = 'LU__'   # 子对象为引用
dict2['age'] = [100, 16]    # 父对象为拷贝
print(dict2)
print(dict1)

-->:
{'name': ['LU__', 'mjj'], 'age': [100, 16], 'sex': ['man', 'wom']}
{'name': ['LU__', 'mjj'], 'age': [18, 16], 'sex': ['man', 'wom']}

  深拷贝需要用到copy模块的deepcopy()函数,copy.deepcopy(dict)

  • dict.fromkeys(seq[, value]),创建一个值全一样的字典。不同的key对应一样的value。

    参数:

      seq,序列中的元素为字典的键值

      value,默认为None。

dict1 = {'name': ['lu', 'mjj'], 'age': [18, 16], 'sex': ['man', 'wom']}
dict2 = dict1.fromkeys('NAME')
dict3 = dict.fromkeys([1, 2, 3], [10, 10])
print(dict2)
print(dict3)
print(dict1)

-->:
{'N': None, 'A': None, 'M': None, 'E': None}
{1: [10, 10], 2: [10, 10], 3: [10, 10]}
{'name': ['lu', 'mjj'], 'age': [18, 16], 'sex': ['man', 'wom']}
  • dict.get(key, default=None),返回指定键值对应的值,如果键值不在字典中返回默认值None。
  • dict.items(),以列表形式(并非直接的列表(dict_items迭代对象),若要返回列表值还需调用list函数)返回可遍历的(键, 值) 元组数组,参数无。
dict1 = {'name': ['lu', 'mjj'], 'age': [18, 16], 'sex': ['man', 'wom']}
dict1_item = dict1.items()
print(dict1_item)
print(type(dict1_item))
print(list(dict1_item))
print(list(dict1))  # 只得到键值列表
for i, j in dict1_item:
    print(i, j)

-->:
dict_items([('name', ['lu', 'mjj']), ('age', [18, 16]), ('sex', ['man', 'wom'])])
<class 'dict_items'>
[('name', ['lu', 'mjj']), ('age', [18, 16]), ('sex', ['man', 'wom'])]
['name', 'age', 'sex']
name ['lu', 'mjj']
age [18, 16]
sex ['man', 'wom']
  • dict.keys(),返回一个可遍历可迭代对象dict_kys,可以使用 list() 来转换为列表。参数无,返回一个迭代器。pthon2.x直接返回一个列表。
dict1 = {'name': ['lu', 'mjj'], 'age': [18, 16], 'sex': ['man', 'wom']}
for i in dict1.keys():
    print(i)
  • dict.setdefault(key, default=None),和 get()方法 类似, 如果键不已经存在于字典中,将会添加键并将值设为默认值。
dict1 = {'name': ['lu', 'mjj'], 'age': [18, 16], 'sex': ['man', 'wom']}
print(dict1.setdefault('name'))
print(dict1.setdefault('birthday', ['1995-8-6', '1995-3-9']))
print(dict1)

-->:
['lu', 'mjj']
['1995-8-6', '1995-3-9']
{'name': ['lu', 'mjj'], 'age': [18, 16], 'sex': ['man', 'wom'], 'birthday': ['1995-8-6', '1995-3-9']}
  • dict.update(dict2),把字典参数 dict2 的 key/value(键/值) 对更新到字典 dict 里,无返回值。
dict1 = {'name': ['lu', 'mjj'], 'age': [18, 16], 'sex': ['man', 'wom']}
dict2 = {'birthday': ['1995-8-6', '1995-3-9']}
print(dict1.update(dict2))
print(dict1)

-->:
None
{'name': ['lu', 'mjj'], 'age': [18, 16], 'sex': ['man', 'wom'], 'birthday': ['1995-8-6', '1995-3-9']}
  • dict.values(),返回一个迭代器,可以使用 list() 来转换为列表,列表为字典中的所有值。
  • pop(key[,default]),删除字典给定键 key 所对应的值,返回值为被删除的值,并修改原字典。key值必须给出。 否则,返回default值。
  • popitem(),返回并删除字典中的最后一对键和值。返回一个键值对(key,value)形式,无参数。

6.集合

集合(set)是一个无序的不重复元素序列。两个重要作用:
  去重:把列表变成集合即可
  关系测试:测试两组数据之前的交集、差集、并集等

8.byte

字节流。有些时候(网络通信)参数传递必须以字节流形式传参。

  • str.encode(),编码,str to byte。
  • b.decode(),解码,byte to str。

9.json

 

posted @ 2020-10-09 15:55  Lu-顺  阅读(258)  评论(0编辑  收藏  举报