python基础 - 变量、数据类型

一、字符编码

Python解释器有:

字节码   机器码

1. CPython: C语言开发, 默认在官网下载安装的python就为Cpython
2. IPython: CPython之上的一个交互式解释器,但是执行Python代码的功能和CPython是完全一样的。
3. PyPy: 注重运行速度, 与CPython有些区别
4. Jpython: 运行在Java平台上的Python解释器
5. IronPython

Python字符编码

早期ASCII编码存储有127个字符,包含大小写字母, 数字和一些符号。由于世界语言众多,会出现多个字符编码,但是在多语言混合的文本中会出现乱码。因此Unicode 字符集应运而生。 Unicode把所有语言都统一到一套编码里, 解决了乱码问题。
其中ASCII编码和Unicode编码的区别:ASCII编码是1个字节,而Unicode编码通常是2个字节。

虽然Unicode解决了乱码问题, 但是存储空间却增加了。由此又出现了“可变长编码”的UTF-8编码。
UTF-8编码把一个Unicode字符根据不同的数字大小编码成1-6个字节,常用的英文字母被编码成1个字节,汉字通常是3个字节,只有很生僻的字符才会被编码成4-6个字节。

Python源代码也是一个文本文件,所以,当你的源代码中包含中文的时候,在保存源代码时,就需要务必指定保存为UTF-8编码。当Python解释器读取源代码时,为了让它按UTF-8编码读取,我们通常在文件开头写上这两行:

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

二、Python数据类型和变量

# python 的数据类型包括:
1. 整数: 包括负整数
2. 浮点数: 小数。 很大或者很小的浮点数,使用科学计数法,如:7.77 x 10^9 可以使用7.77e9 或者使用77.7e8
0.00012使用:1.2e-4
2. 字符串
3. 布尔值
4. list
5. 字典
。。。
python 变量
变量是任意数据类型。
变量在程序中就是用一个变量名表示了,变量名必须是大小写英文、数字和_的组合,且不能用数字开头

python在定义变量时不需要指定其类型,python解释器在定义个变量如:a = 'abc' 时做了两件事:
1. 在内存中创建了一个'abc'字符串;
2. 在内存中创建了一个名为a的变量, 并把它指向'ABC'
python 常量: 不能变的量
在Python中,通常用全部大写的变量名表示常量:
PI = 3.1415926

三、输入输出

3.1 输出

python使用print()函数进行输出如:
    print("Hello python %s" % pa)
python的格式化输出:
  print('%2d-%02d' % (3, 1))
  print('%.2f' % 3.1415926)
  print("Name is: %s:" % name)

s1 = "%s language" % "Python" ##结果:Python language
s2 = "percent %.5f %%" % 99.8999333121 ##结果:percent 99.89993 %
s3 = "My name is %(name)s age %(age)d" % {"name":"xiaoming","age":20} ##结果: My name is xiaoming age 20
s4 = "your record is %(record).2f" %{"record": 98.922} ##结果:your record is 98.92
s5 = "Linux %+20s language" % "Python" ##结果:Linux Python language
s6 = "Linux %-20s language" % "Python" ##结果:Linux Python language
"Linux \033[32;11m%s\033[0m language" % "Python" #还可以添加颜色

python 字符串格式化符号:

符 号描述
%c 格式化字符及其ASCII码
%s 格式化字符串
%d 格式化整数
%u 格式化无符号整型
%o 格式化无符号八进制数
%x 格式化无符号十六进制数
%X 格式化无符号十六进制数(大写)
%f 格式化浮点数字,可指定小数点后的精度
%e 用科学计数法格式化浮点数
%E 作用同%e,用科学计数法格式化浮点数
%g %f和%e的简写
%G %F 和 %E 的简写
%p 用十六进制数格式化变量的地址

 

格式化操作符辅助指令:

符号功能
* 定义宽度或者小数点精度
- 用做左对齐
+ 右对齐:在正数前面显示加号( + )
<sp> 右对齐:在正数前面显示空格,负数前面加负号
# 在八进制数前面显示零('0'),在十六进制前面显示'0x'或者'0X'(取决于用的是'x'还是'X')
0 显示的数字前面填充'0'而不是默认的空格
% '%%'输出一个单一的'%'
(var) 映射变量(字典参数)
m.n. m 是显示的最小总宽度,n 是小数点后的位数(如果可用的话)

format()
format()另外一种格式化字符串的format()方法, 它会用传入的参数一次替换字符串的占位符{0},{1},{2}...
>>> 'hello, {0}, 你的成绩是:{1:.3f}'.format('小明',98.33)
'hello, 小明, 你的成绩是:98.330'

3.2 输入

python可以使用input()函数 获取用户从键盘输入的内容。可以使用一个变量接收输入的内容。使用方法如下:
name = input("Please input your name:")
print("Name is: %s:" % name)

四、条件判断

if <条件判断1>:
   <执行1>
elif <条件判断2>:
   <执行2>
elif <条件判断3>:
   <执行3>
else:
   <执行4>
 1 #!/usr/bin/env python
 2 # -*- coding:utf-8 -*-
 3 
 4 n = 3
 5 while n > 0:
 6     name = input("Please input Username:")
 7     pass = input("please input Password:")
 8     if name == "zkc" and pass == "123456":
 9         print("Login Successful!")
10         break
11     else:
12         print("Username or Password Error!")
13         n = n - 1
14         print("你还有%d次机会" % n)                

五、循环

python循环有 for while语句
## while语句:要条件满足,就不断循环,条件不满足时退出循环。
while 条件语句:
## 遍历列表
for x in range(100):
for x  in [1,2,3,4,5]:  
   
break在循环中,break语句可以提前退出循环。
continue在循环过程中,也可以通过continue语句,跳过当前的这次循环,直接开始下一次循环。

六、Python基本数据类型

6.1运算符

6.1.1 算术运算符

以下假设变量: a=10,b=20

运算符描述实例
+ 加 - 两个对象相加 a + b 输出结果 30
- 减 - 得到负数或是一个数减去另一个数 a - b 输出结果 -10
* 乘 - 两个数相乘或是返回一个被重复若干次的字符串 a * b 输出结果 200
/ 除 - x除以y b / a 输出结果 2
% 取模 - 返回除法的余数 b % a 输出结果 0
** 幂 - 返回x的y次幂 a**b 为10的20次方, 输出结果 100000000000000000000
// 取整除 - 返回商的整数部分(向下取整 >>> 9//2 4 >>> -9//2 -5

6.1.2 比较运算符

运算符描述实例
== 等于 - 比较对象是否相等 (a == b) 返回 False。
!= 不等于 - 比较两个对象是否不相等 (a != b) 返回 true.
<> 不等于 - 比较两个对象是否不相等。python3 已废弃。 (a <> b) 返回 true。这个运算符类似 != 。
> 大于 - 返回x是否大于y (a > b) 返回 False。
< 小于 - 返回x是否小于y。所有比较运算符返回1表示真,返回0表示假。这分别与特殊的变量True和False等价。 (a < b) 返回 true。
>= 大于等于 - 返回x是否大于等于y。 (a >= b) 返回 False。
<= 小于等于 - 返回x是否小于等于y。 (a <= b) 返回 true。

6.1.3 赋值运算符

运算符描述实例
= 简单的赋值运算符 c = a + b 将 a + b 的运算结果赋值为 c
+= 加法赋值运算符 c += a 等效于 c = c + a
-= 减法赋值运算符 c -= a 等效于 c = c - a
*= 乘法赋值运算符 c *= a 等效于 c = c * a
/= 除法赋值运算符 c /= a 等效于 c = c / a
%= 取模赋值运算符 c %= a 等效于 c = c % a
**= 幂赋值运算符 c = a 等效于 c = c a
//= 取整除赋值运算符 c //= a 等效于 c = c // a

6.1. 4 位运算符

python的位运算是把数字看做二进制进行计算的。

a=60 b=13

运算符描述实例
& 按位与运算符:参与运算的两个值,如果两个相应位都为1,则该位的结果为1,否则为0 (a & b) 输出结果 12 ,二进制解释: 0000 1100
| 按位或运算符:只要对应的二个二进位有一个为1时,结果位就为1。 (a | b) 输出结果 61 ,二进制解释: 0011 1101
^ 按位异或运算符:当两对应的二进位相异时,结果为1 (a ^ b) 输出结果 49 ,二进制解释: 0011 0001
~ 按位取反运算符:对数据的每个二进制位取反,即把1变为0,把0变为1 。~x 类似于 -x-1 (~a ) 输出结果 -61 ,二进制解释: 1100 0011,在一个有符号二进制数的补码形式。
<< 左移动运算符:运算数的各二进位全部左移若干位,由 << 右边的数字指定了移动的位数,高位丢弃,低位补0。 a << 2 输出结果 240 ,二进制解释: 1111 0000
>> 右移动运算符:把">>"左边的运算数的各二进位全部右移若干位,>> 右边的数字指定了移动的位数 a >> 2 输出结果 15 ,二进制解释: 0000 1111

6.1.5 逻辑运算符

运算符描述实例
and 布尔与 如果x 为false,x and y 返回false,否则返回y的计算值。 (a and b ) 返回true
or 布尔或 如果x为True, x and y返回True, 否则返回y的计算值。 (a and b ) 返回true
not 布尔非 就是取反, 如果x为true,返回false. not (a and b ) 返回false

6.1.6 成员运算符

算符描述实例
in 如果指定的成员在序列中找到值,返回True 否则False  
not in 如果指定的成员在序列中没有找到值,返回True 否则False  

6.1. 身份运算符

运算符描述实例
is is 是判断两个标识符是不是引用自一个对象 x is y, 类似 id(x) == id(y) , 如果引用的是同一个对象则返回 True,否则返回 False
is not is not 是判断两个标识符是不是引用自不同对象 x is not y , 类似 id(a) != id(b)。如果引用的不是同一个对象则返回结果 True,否则返回 False。
# [id()](https://www.runoob.com/python/python-func-id.html) 函数用于获取对象内存地址。
# is 与 == 区别:
is 用于判断两个变量引用对象是否为同一个(同一块内存空间), == 用于判断引用变量的值是否相等。

6.1.7 运算符优先级

运算符描述
** 指数 (最高优先级)
~ + - 按位翻转, 一元加号和减号 (最后两个的方法名为 +@ 和 -@)
* / % // 乘,除,取模和取整除
+ - 加法减法
>> << 右移,左移运算符
& 位 'AND'
^ | 位运算符
<= < > >= 比较运算符
<> == != 等于运算符
= %= /= //= -= += *= **= 赋值运算符
is is not 身份运算符
in not in 成员运算符
not and or 逻辑运算符

6.2 基本数据类型

6.2.1 数字

Python数字类型包括
1. 整数和浮点数
2. 复数
3. 固定精度的十进制数
4. 有理分数
5. 集合
6. 布尔类型
7. 无穷的整数精度
8. 各种数字内置函数和模块

数字类型支持算术运算,还支持一些常用的数学模块 (math、random)和内置数学函数(pow, abs, round, int, hex, bin, min, max等)
## math
>>> import math
>>> math.pi
3.141592653589793
>>> math.sqrt(88)
9.38083151964686
>>> math.sqrt(64)
8.0
## random
>>> import random
>>> random.random()
0.6014985194240732
>>> random.choice([1,2,3,4,5])
4
## pow()
>>> pow(2,4) ==> 2**4
16
## abs() 绝对值
>>> abs(-12.4)
12.4
## sum()
>>> sum((1,2,3,4))
10
>>> sum([1,2,3])
6
## min(),max()
>>> min(1,10,-4,3),max(3,10,-9,199)
(-4, 199)
## int() 类型转换 bin()
>>> s='123'
>>> int(s)
123
>>> int(s,10)
123
>>> int(s,16)
291
>>> int(s,8)
83
>>> bin(2)
'0b10'
整型数据类型支持的具体方法可以参考 class int(object) 如:
def bit_length(self): # real signature unknown; restored from __doc__
>>> num = 12
>>> num.bit_length() ## 12 的二进制为 1100 4位
4

6.2.2 布尔型

6.2.3 字符串

字符串或串(String)是由数字、字母、下划线组成的一串字符。
在python中字符串也是一种序列 --- 字符串是单个字符的字符串的序列。序列还包括:列表和元组
在python中的每个对象都可分为不可变性和可变性, 在核心数据中:字符串、数字、元组是不可变的。

1. 字符串序列的操作:
>>> s='python'
>>> s[1:]
'ython'
>>> len(s)
6
>>> s[1:]
'ython'
>>> s[0]
'p'
>>> s[:]
'python'
>>> s[-1]
'n'
2.字符串支持 + 号 合并
>>> s="python"
>>> s1="language"
>>> s+s1
'pythonlanguage'
>>> s + ' ' + s1
'python language'
3. 字符串的不可变性
>>> s="python"
>>> s[0] = 'P'
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: 'str' object does not support item assignment
>>> s = 'P' + s[1:]
>>> s
'Python'
4. 字符串特定的方法:
字符串提供了一系列的方法,实现更负载的文本处理任务。可以使用dir(s) S为字符串变量,查看有哪些方法:
>>> s
'Python'
>>> dir(s)
['__add__', '__class__', '__contains__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__getnewargs__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__iter__', '__le__', '__len__', '__lt__', '__mod__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__rmod__', '__rmul__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', 'capitalize', 'casefold', 'center', 'count', 'encode', 'endswith', 'expandtabs', 'find', 'format', 'format_map', 'index', 'isalnum', 'isalpha', 'isascii', 'isdecimal', 'isdigit', 'isidentifier', 'islower', 'isnumeric', 'isprintable', 'isspace', 'istitle', 'isupper', 'join', 'ljust', 'lower', 'lstrip', 'maketrans', 'partition', 'replace', 'rfind', 'rindex', 'rjust', 'rpartition', 'rsplit', 'rstrip', 'split', 'splitlines', 'startswith', 'strip', 'swapcase', 'title', 'translate', 'upper', 'zfill']
>>>
# s.capitalize() 首字母大写

# s.casefold() 字符串全部改为小写 功能和s.lower一样,但是casefold功能更全面。

# s.center(width, fillchar=' ') 设置字符串长度,空白处指定字符填充
>>> ss.center(30,"*")
'*****Ks fF sa2D$FsqsdfER******

# s.count('n') # 子字符串n 在字符创s出现多少次,

# s.endwith("") #以什么结尾 s.startwith() # 以什么开始

# s.expandtabs(n) 方法把字符串中的 tab 符号 \t 转为空格,tab 符号 \t 默认的空格数是 8,在第 0、8、16...等处给出制表符位置,如果当前位置到开始位置或上一个制表符位置的字符数不足 8 的倍数则以空格代替。
info = "name\tpasswd\tmail\nzkc\t12345\tkk@qq.com\nzkc\t12345\tkk@qq.com\nzkc\t12345\tkk@qq.com\nzkc\t12345\tkk@qq.com\n"
print(info)
v = info.expandtabs(20)
print(v)
输出结果:
name passwd mail
zkc 12345 kk@qq.com
zkc 12345 kk@qq.com
zkc 12345 kk@qq.com
zkc 12345 kk@qq.com

name passwd mail
zkc 12345 kk@qq.com
zkc 12345 kk@qq.com
zkc 12345 kk@qq.com
zkc 12345 kk@qq.com

# s.format() 格式化, 将一个字符串中的占位符替换为指定的值
>>> s1 = "{lan} is a computer language"
>>> s2 = s1.format(lan="Python")
>>> s2
'Python is a computer language'

# 字符串修改 s.replace(old, new, count=-1, /)
>>> s=s.replace('Py',"kkkk")
>>> s
'kkkkthon'
>>> str1 = "you is a good boy!"
>>> str1.replace('o','BBB',1)
'yBBBu is a good boy!'
>>> str1.find('o')
1

# s.find('') 方法返回在子字符串出现处的偏移, 未找到时返回1
# s.index("ss") 子字符串ss 在s字符串中首次出现的序列号。 没有返回错误。 一般使用find替换。
>>> ss
'Ks fF sa2D$FsqsdfER'
>>> ss.index('sa')
6

# s.isalnum() #如果 string 至少有一个字符并且所有字符都是字母或数字则返回 True,否则返回 False
>>> s = "asJd78SE"
>>> s.isalnum()
True
>>> s1 = "K,sfa*fsa"
>>> s1.isalnum()
False

# s.isalpha() #如果 string 至少有一个字符并且所有字符都是字母则返回 True,否则返回 False.
# s.isdecimal() #如果 string 只包含十进制数字则返回 True 否则返回 False.
# s.isdigit() #如果 string 只包含数字则返回 True 否则返回 False.
# s.isidentifier() #如果字符串是有效标识符,则 isidentifier() 方法返回 True,否则返回 False。
# s.islower() #如果字符串中的所有字符都是小写,则返回 True.
# s.isnumeric() #如果字符串中的所有字符都是数,则返回 True。
>>> s = "二"
>>> s.isdigit()
False
>>> s.isnumeric()
True
# s.isprintable() #如果字符串中有可转化字符(/t /n 等) 则为false。
>>> s.isprintable()
True
>>> s1="sfa\tsafsa"
>>> s1
'sfa\tsafsa'
>>> s1.isprintable()
False
# s.isspsce() #如果字符串中的所有字符都是空白字符,则返回 True。 空字符串
# s.istitle() ## 字符串是否为标题(在一个字符串中,每个字符的首字母都是大写)
# s.title() ## 将字符串转为 标题字符串
>>> s1="Python is a computer language"
>>> s1.title()
'Python Is A Computer Language'
>>> s1.istitle()
False
>>> s=s1.title()
>>> s.istitle()
True

# s.issupper() # 如果字符串中的所有字符都是大写,则返回 True。


# 字符串方法join 可以将列表合成一个字符串,通过特定字符将列表合成一个字符串
>>> L = ["python","learn","language"]
>>> L
['python', 'learn', 'language']
>>> PP = ':'.join(L)
>>> PP
'python:learn:language'


# s.strip(chars=None) s.lstrip(chars=None) s.rstrip(chars=None) # 去除字符串左右空白符 \n \t 或指定的字符
>>> s
' asfa\t'
>>> s.strip()
'asfa'
>>> s.lstrip()
'asfa\t'
>>> s.rstrip()
' asfa'
>>>

# s.maketrans() ## 方法用于创建字符映射的转换表,对于接受两个参数的最简单的调用方式,第一个参数是字符串,表示需要转换的字符,第二个参数也是字符串表示转换的目标。
m = str.maketrans("love","5211")
print(m) ##结果为:{108: 53, 111: 50, 118: 49, 101: 49}
ss = "losfawvDvesaovdsl"
new_ss = ss.translate(ss)
print(new_ss) ## 结果为:losfawvDvesaovdsl

# s.partition(str) ##有点像 find()和 split()的结合体,从 str 出现的第一个位置起,把字符串s分成一个3元素的元组 (string_pre_str,str,string_post_str),如果 s中不包含str 则 string_pre_str == s.
s = "sfsdfedgasffas"
v = s.partition('a')
print(v) ##结果为:('sfsdfedg', 'a', 'sffas')

# s.split('分隔符') split方法将一个字符串以分隔符分隔成一个列表,默认是分隔符为空格。

# s.swapcase() # s中大小写转换

字符串练习:

1. 环提示用户输入:用户名,密码,邮箱(要求用户输入的长度不超过20个字,如果超过则只有前20个字符有效)如果用户输入q或Q表示不再继续输入。

 1 #!/usr/bin/env python
 2 # -*- coding:utf-8 -*-
 3 info=""
 4 while True:
 5     username = input("Input your name(less than 20byte):")
 6     passwd = input("Input your password:")
 7     mails = input("Input your mail:")
 8     if len(username) > 20:
 9         username = username[:20]
10 
11     result = "Username\tPassword\tMail\n{0}\t{1}\t{2}\n"
12     result = result.format(username,passwd,mails)
13     info += result
14     print(info.expandtabs(25))
15     res = input("Do you want to continue:(yes/q/Q)")
16     if res == 'q' or res == 'Q':
17         break

2.制作验证码验证, 登录次数限制;

 1 def check_code():
 2     import random
 3     checkcode = ''
 4     for i in range(4):
 5         current = random.randrange(0, 4)
 6         if current != i:
 7             temp = chr(random.randint(65, 90))
 8         else:
 9             temp = random.randint(0, 9)
10         checkcode += str(temp)
11     return checkcode
12 
13 sec = 3
14 while sec > 0:
15     name = input("请输入用户名: ")
16     Passwd = input("请输入密码: ")
17     if name != 'zkc' or Passwd != '123':
18         print("用户名或密码错误!")
19         sec -= 1
20         continue
21     code = check_code()
22     code = code.lower()
23     print("验证码为:%s" % code)
24     s = input("请输入验证码: ")
25     if s == code:
26         print("登录成功")
27         break
28     else:
29         print("验证码错误")

6.2.4 列表

# 列表是Python最具灵活性的有序集合对象类型。具有以下属性:
1. 任意对象的有序集合
2. 通过偏移读取数据内容
3. 可变长度, 异构以及任意嵌套
    长度可增可短,可包含任意类型的对象(异构),列表中还可以嵌套列表
    l = [1, 2, 3, 4, "sdfa", "sfa", [123, 5.4]]
4. 属于可变序列的分类
    列表支持原处修改,如删除,修改和索引赋值等操作。
5. 对象应用数组
    Python列表包含了零个或多个其他对象的引用, 在标准Python解释器内部,列表就是C数组而不是链接结构。  
    在用到引用时, Python总是会将这个引用指向一个对象,所以程序只需处理对象的操作。 当把一个对象赋值一个数据结构元素或变量名时,Python总是会存储对象的引用,而不是对象的一个拷贝。

# 可以使用help(list)或者dir(list)查看list方法的完整列表清单。

列表操作

#基本操作
1. 列表合并和重复
    >>> l = ["python","language"]
    >>> l1 = ["java","c","c++"]
    >>> l + l1
    ['python', 'language', 'java', 'c', 'c++']
    >>> l * 2
    ['python', 'language', 'python', 'language']
2. 索引取值(切片)
    索引取值和字符串的相同
    >>> l[1]
    'language'
    >>> l[:]
    ['python', 'language']
    >>> l1[:3]
    ['java', 'c', 'c++']
    
    # 修改列表的值
    >>> l1[1]="go"
    >>> l1
    ['java', 'go', 'c++']
#列表迭代和解析
1. 成员关系
    >>> "python" in l
    True
2. 迭代,遍历
    >>> for i in l1:
    ...     print(i)
    ...
    java
    c
    c++
    
     >>> l2 = [i for i in "Linux system"]
    >>> l2
    ['L', 'i', 'n', 'u', 'x', ' ', 's', 'y', 's', 't', 'e', 'm']
    
    >>> l3 = [k**2 for k in range(5) ]
    >>> l3
    [0, 1, 4, 9, 16]
    
    >>> list(map(abs,[-1,-19,932,88,23,87,-293]))
    [1, 19, 932, 88, 23, 87, 293]
    
#列表方法的调用
1. list.append() 在列表中追加对象
    >>> l1
    ['java', 'go', 'c++']
    >>> l1.append("Python")
    >>> l1
    ['java', 'go', 'c++', 'Python']
    
2. 对列表进行排序
    排序方法有两种,一个是list.sort() 另外一个就是 sorted()
    1. list.sort(key=None,reverse=False) #将list自身进行排序,不返回新的list对象,默认升序;
    2. sorted(iterable,key=None,reverse=False) #返回排好序的新列表,不改变对象本身,默认升序.
      
    ## list.sort()
        >>> l1.sort()
        >>> l1
        ['Python', 'c++', 'go', 'java']
        >>> l1
        ['Python', 'c++', 'go', 'java']
        >>> l1.sort(key=str.lower)
        >>> l1
        ['c++', 'go', 'java', 'Python']
    ## sorted()
        >>> L
        ['abc', 'MND', 'saFS', 'def']
        >>> sorted(L)
        ['MND', 'abc', 'def', 'saFS']
    
        >>> sorted(L,reverse=True)
        ['saFS', 'def', 'abc', 'MND']
        >>> sorted(L, key=str.lower, reverse=True)
        ['saFS', 'MND', 'def', 'abc']
       
        >> L
        ['abc', 'MND', 'saFS', 'def']
        >>> sorted([x.lower() for x in L], reverse=True)
        ['safs', 'mnd', 'def', 'abc']
        
3. list.extend() 方法能够在列表末端插入多个元素
    extend(self, iterable, /)  ## 可迭代对象
    >>> l1.extend(["C#","shell","c"])
    >>> l1
    ['c++', 'go', 'java', 'Python', 'C#', 'shell', 'c']
    
4. list.insert() 方法 指定位置插入元素
    insert(self, index, object, /)
    >>> l1
    ['c++', 'java', 'Python', 'C#', 'shell']
    >>>
    >>> l1.insert(1, "Java")
    >>> l1
    ['c++', 'Java', 'java', 'Python', 'C#', 'shell']
    
5. list.pop() 方法可以删除列表指定位置的元素(默认为末端)   
      pop(self, index=-1, /)
    >>> l1
    ['c++', 'go', 'java', 'Python', 'C#', 'shell', 'c']
    >>> l1.pop(1)
    'go'
    >>> l1
    ['c++', 'java', 'Python', 'C#', 'shell', 'c']
    >>> l1.pop()
    'c'
    >>> l1
    ['c++', 'java', 'Python', 'C#', 'shell']
   
6. del删除某项或某片段
    >>> del(l1[0])
    >>> l1
    ['Java', 'java', 'Python', 'C#', 'shell']
    >>> del(l1[:3])
    >>> l1
    ['C#', 'shell']    
   
7. list.remove() ## 删除列表某个元素
    remove(self, value, /)
    
8. list.copy()  ##浅拷贝
    >>> l2 = l1.copy()
    >>> l1
    ['C#', 'shell']
    >>> l2
    ['C#', 'shell']
    >>> id(l1)
    2648704676360
    >>> id(l2)
    2648702454472
9. list.reverse() ## 将列表进行翻转

 

6.2.5 元组

元组:tuple
元组有简单的对象组构成,元组不能在原处修改, 是一个不可变的python类型。
元组使用圆括号() , 具有以下属性:
1. 任意对象的有序集合
    元组是一个有序的对象的集合, 与列表相同, 可以嵌套到任何类别的对象中。
2. 通过偏移存取
    同字符串、列表一样,在元组中的元素通过偏移来访问。如索引和分片
3. 属于不可变序列类型
    和字符串一样,元组也是不可变类型。不支持在原处进行修改操作。
4. 固定长度,异构,任意嵌套
    因为元组是不可变的,所以在不生成一个拷贝的情况下,不能进行增长和缩短。元组可以包含其他的复合对象。
5. 对象引用的数组

常见元组常量和运算

()             #空元组
T=(0,'KK',1.2,3,)  # 四个元素的元组
T=("jelp",("hello","sk"))  # 嵌套元组
T = tuple('python')      # 一个可迭代对象的项的元组
T[i]
T[i][j]
len(T)
T1 + T2 # 合并
T1 * 2  # 重复
for x in T: print(x) # 迭代
'jelp' in T1   [x**2 for x in T1]# 成员关系

#元组中方法
    tuple.count()
        count(self, value, /)
    tuple.index()
        index(self, value, start=0, stop=9223372036854775807, /)
# 字符串,元组,列表之间的相互转换
    >>> s = "python"
    >>> tu = tuple(s)
    >>> tu
    ('p', 'y', 't', 'h', 'o', 'n')
    >>> t1 = ("python","ni","la")
    >>> s1 = ''.join(t1)  #当t1中的元素全部为字符串
    >>> s1
    'pythonnila'
    
    >>> list(tu)
    ['p', 'y', 't', 'h', 'o', 'n']
    
    >>> L1 = [1,2,3,4]
    >>> tuple(L1)
    (1, 2, 3, 4)

6.2.6 字典

字典-dict  是python中最灵活的内置数据结构类型。
相比列表是有序的对象集合,那字典就是无序的集合。主要差别是在: 字典的元素是通过键来存取的,而不是通过偏移存取。
具有以下属性:
    1. 通过键而不是偏移来存取数据
    2. 任意对象的无序集合
    3. 可变长,异构,任意嵌套
    4. 属于可变映射类型  --  键值映射
    5. 对象引用表(散列表)
        字典作为散列表(支持快速检索的数据结构)来实现的,字典存储的是对象引用(而不是拷贝)

# 可以使用help(dict)或者dir(dict)查看dict方法的完整列表清单。

## 元组可以作为字典的key
# 字典常量和操作
D = {}                  #空字典
D = {"name":"python","age":25}  # 两项目字典
D = {"language":{"gaoji":"GO", "other": "java"}}  #嵌套
D = dict.fromkeys(['a','b'])  ## 其他方法进行构建 dict
D = dict(name="zkc",age=26)  
D["name"]   ## 以键进行索引 其值
"name" in D  ## 成员关系, 键存在与否
D.keys()  ## 获取D中键 返回可迭代的视图,可通过for遍历此值
    >>> D.keys()
    dict_keys(['name', 'age'])
       >>> for i in D.keys():
    ...     print(i)
    ...
    name
    age
D.values() ## 获取D中值,返回可迭代的视图,可通过for遍历此值
D.items()  ## 获取键和值,返回可迭代的视图,可通过for遍历此值
    >>> D.items()
    dict_items([('name', 'zkc'), ('age', 26)])
    >>> for k,v in D.items():
    ...    print(k, v)
    ...
    name zkc
    age 26
D.copy()  #拷贝  副本
    >>> d1 = D.copy()
    >>> d1
    {'name': 'zkc', 'age': 26}
    >>> id(d1)
    2648704711920
    >>> id(D)
    2648704712208
D.get(key,defalut) # 根据键获取值
D.update(D2)  ## 合并
D.pop(key)   ## 删除
len(D)        ## 获取字典长度
D[key] = "python" # 新增,修改,删除键
del D[key]  ## 根据键删除条目
list(D.keys()) 
D = {x:x**2 for x in range(8)}  ##字典解析

dict.setdefault() # 设置值,已经存在获取当前值, 不存在添加给定的默认值

示例:

 1 #!/usr/bin/env python
 2 # -*- coding:utf-8 -*-
 3 
 4 ### 9*9乘法表
 5 # for i in range(1, 10):
 6 #     for j in range(1, i + 1):
 7 #         print("%d * %d = %d\t" % (j, i, i * j), end="")
 8 #     print("")
 9 
10 user_info = []
11 for i in range(321):
12     user_info.append({"name": "ccx" + str(i), "mail": "ccx" + str(i) + "@ccx.cn", "address": i})
13 
14 # 输出所以user info 内容:
15 # for i in range(303):
16 #     for k, v in user_info[i].items():
17 #         print("%s\t" % str(v), end="")
18 #     print("")
19 # 每页十条数据
20 # user_info[0:10] ##第一页
21 # user_info[10:20] ##第二页
22 # user_info[20:30] ##第三页
23 # 所以第 5 页 的内容就在  user_info[4*10,5*10]
24 
25 # 总页数
26 total_page = len(user_info) // 10 + 1
27 # 最后一页的条数:
28 other_info = len(user_info) % 10
29 
30 while True:
31     page = input("请输入页数:")
32     if not page.isnumeric():
33         print("请输入数字!!\t",end="")
34         continue
35     page = int(page)
36     if page > total_page:
37         print("超出页数!")
38         continue
39     #当时最后一页时, 内容取值范围
40     if page == total_page:
41         start_info = (page - 1) * 10
42         end_info = start_info + other_info
43     else:
44         start_info = (page-1) * 10
45         end_info = page * 10
46 
47     title_info = "name\tmail\taddress"
48     print(title_info.expandtabs(20))
49 
50     for i in range(start_info, end_info):
51         for v in user_info[i].values():
52             print("%s\t" % str(v), end="\t\t")
53         print("")
View Code

6.2.7集合

集合(set) 是唯一、不可变的对象的一个无序集合。集合有着广泛的引用,尤其是在涉及数字和数据库的工作中。
python3中可以使用 {} 和set()函数创建集合, 创建一个空集合必须使用set() 函数

# 集合的定义:
    parame = {value01,value02,...}
    或者
    set(value)
   >>> s
    {1, 2, 3, 4, 5}
    >>> type(s)
    <class 'set'>
# 集合间的运算
    >>> s1 = {1,2,3,4,5}
    >>> s2 = {3,49,2,10}
    >>> 3 in s1      # 判断元素是否存在集合内
    True
    # 差集 difference
    >>> s1 -s2         # 集合s1包含而集合s2 中不包含的元素,和集合的内置函数difference一样:s1.difference(s2)
    {1, 4, 5}
    >>> s1.difference(s2)
    {1, 4, 5}
        #其中函数:difference_update() 是将结果返回给调用此函数的集合。如
        >>> S1.difference(S2)
        {1, 2}
        >>> S1
        {1, 2, 3, 4}
        >>> S1.difference_update(S2)
        >>> S1
        {1, 2}
        
    # 并集 union
    >>> s1 | s2        # 集合s1和集合s2的并集Union, 和集合的内置函数 union() 一样:s1.union(s2)
    {1, 2, 3, 4, 5, 10, 49}
    >>> s1.union(s2)
    {1, 2, 3, 4, 5, 10, 49}
    
    # 交集
    >>> s1 & s2        # 集合s1 和集合s2 的交集intersection,和集合的内置函数intersection() 一样: s1.intersection(s2)
    {2, 3}    
    >>> s1.intersection(s2)
    {2, 3}
    
    # symmetric_difference() 返回两个集合中不重复的元素集合。 交叉补集
    >>> s1 ^ s2     # 不同时包含于s1 和 s2 的元素
    {1, 4, 5, 10, 49}
    >>> s1.symmetric_difference(s2)
    {1, 4, 5, 10, 49}
    
    # 子集判断 issubset()  
        >>> s1
        {1, 2, 4}
        >>> s2
        {1, 2, 3, 4, 5}
        >>> s1.issubset(s2)
        True
         #其中使用 s2.issuperset(s1)的结果上上述一样: 父集判断
            >>> s2.issuperset(s1)
            True
    
    # set.isdisjoint() # 两个集合的交集为空则返回true
        >>> S1 = {1,2,3,4}
        >>> S2 = {5,6,7,8}
        >>> S1.isdisjoint(S2)
        True
        >>> S1 & S2
        set()
        

集合的基本操作

 

1. 添加元素
    set.add(x)
    set.update(x)  # 参数可以是列表, 元组, 字典等
    >>> s2.add("Python")
    >>> print(s2)
    {2, 3, 'Python', 'Language', 10, 49}
    
    >>> s2.update(("c++","Go",))
    >>> s2
    {2, 3, 'Python', 'Language', 10, 49, 'c++', 'Go'}
    >>> s2.update({"name":"zkc"})
    >>> s2
    {2, 3, 'Python', 'Language', 10, 49, 'c++', 'Go', 'name'}
    >>> s2.update(["java","Ops"])
    >>> s2
    {2, 3, 'Python', 'Language', 10, 'Ops', 'java', 49, 'c++', 'Go', 'name'}
2. 移除元素
    set.remove(X)
    set.discard(x)
    set.pop()  #随机删除集合中的元素
3. 清空集合
    set.clear()
    
4. 集合解析
    >>> {x**2 for x in [1,2,3,4,5]}
    {1, 4, 9, 16, 25}
5. 集合列表的相互转换
    >>> s2
    {1, 2, 3, 4, 5}
    >>> L2 = list(s2)
    >>> L2
    [1, 2, 3, 4, 5]
    
    >>> L3 = ["zkc", "ks", "yj"]
    >>> L3
    ['zkc', 'ks', 'yj']
    >>> S3 = set(L3)
    >>> S3
    {'ks', 'zkc', 'yj'}

 示例

 1 #!/usr/bin/env python
 2 # -*- coding:utf-8 -*-
 3 
 4 shop_car = []
 5 goods = [
 6     {"name": "电脑", "price": 6786},
 7     {"name": "鼠标", "price": 60},
 8     {"name": "Go语言基础", "price": 78},
 9     {"name": "Jenkins 2权威指南", "price": 128},
10 ]
11 s = "index\tgoods\tprice"
12 s = s.expandtabs(10)
13 print(s)
14 for i in enumerate(goods):
15     inde = i[0]
16     goods_name = i[1]["name"]
17     goods_price = i[1]["price"]
18     s1 = "%-6d\t%-6s\t%-6s" % (inde, goods_name, goods_price)
19     # s1 = "%(index)d\t%(name)s\t%(price)s" % {"index": inde, "name": goods_name, "price": goods_price}
20     s1.expandtabs(20)
21     print(s1)
22 
23 money = input("Please input money: ")
24 money = int(money)
25 
26 
27 def display_shopcar(l):
28     print("购物车物品如下: ")
29     for i in enumerate(l):
30         print("%d\t%s\t价格:%d" % (i[0], i[1][0], i[1][1]))
31 
32 
33 while True:
34     goods_index = input("请输入购买物品序号: ").strip()
35     if goods_index.isdigit():
36         goods_index = int(goods_index)
37     if goods_index < len(goods) and goods_index >= 0:
38         gname = goods[goods_index]["name"]
39         gprice = goods[goods_index]["price"]
40         print("此物已添加购物车")
41         shop_car.append((gname, gprice,))
42         choice = input("是否继续添加物品(y/n)")
43         choice = choice.lower()
44         if choice == "n":
45             break
46     else:
47         print("输入错误!")
48 
49 
50 def chongzhi():
51     global money
52     while True:
53         amoney = input("请输入充值数: ")
54         if amoney.isdigit():
55             amoney = int(amoney)
56             money += amoney
57             print("当前余额为: %d" % money)
58             break
59         else:
60             print("输入错误")
61             continue
62 
63 
64 def jiezhang():
65     global money
66     total_price = 0
67     buy_goods = []
68     display_shopcar(shop_car)
69     nums = input("请输入需结账物品的序号: ")
70     for n in nums:
71         n = int(n)
72         print(n)
73         print(shop_car)
74         print(shop_car[n])
75         buy_goods.append(shop_car[n])
76 
77 
78     for i in buy_goods:
79         total_price += i[1]
80     if total_price > money:
81         print("余额不足! 相差: %d元" % (total_price - money))
82         choice = input("是否进行充值(y/n)").strip().lower()
83         if choice == "y":
84             chongzhi()
85         else:
86             print("余额不足,退出购买!")
87         if money >= total_price:
88             money -= total_price
89             print("成功购买!")
90             print("当前余额为: %d" % money)
91             display_shopcar(shop_car)
92         else:
93             print("余额不足,退出购买!")
94 
95 if __name__ == "__main__":
96     jiezhang()
View Code

 

 

posted @ 2020-09-21 15:59  zkchang  阅读(226)  评论(0)    收藏  举报