Python基础

3.1注释

注释:单行注释,多行注释,批量注释,中文注释,特殊注释

3.1.1单行注释 #

#我是单行注释
>>>print("hello")
>>>print("hello")  #我是单行注释

3.1.2多行注释,批量注释

'''我是多行注释'''
"""我是批量注释"""

3.1.3 中文注释。#

#coding=utf-8# 
-*- coding:utf-8 -*-

 必须放在首部

3.1.4 特殊注释 #

#!/usr/bin/env python

主要用于linux系统,用来告诉系统python解释器的位置

3.2标识符

组成是由字母数字下划线,不能以数字开头

大小写敏感区分

不能使用关键字,保留字

以双下划线开头的和结尾的表示特殊含义

3.3变量

3.3.1 通常声明和赋值

变量名=字面量或表达式                 

>x=5;分号可加可不加
>print(x)5>x=5;y=6;z=7多个变量分号区分
>print(y);
6

分号或者换行代表结束

>str="hello"
>print(str)
hello
>info="abcdefg"
>info
abcdefg

文件的形式不可以省略print

3.3.2 链式赋值

变量1=变量2=字面量或表达式

等价于

变量2=字面量或表达式

变量1=变量2

3.4 复合赋值运算符(简洁表达式)

+=

-=

*=

/=

//=整除

num1=5; 
num1+=1; 
num1;
6

定义过的变量可以反复使用

3.5删除变量

>del info
>info
报错

3.6解包

>x,y=1,2(abc)
>x
1
>y2
(abc)

前后个数一样,类型可以不一致

 

 

3.1常量

python里面没有常量

大写就表示常量

>>>NUM=5

3.2数据类型

分为内置数据类型,自定义数据类型

内置数据类型:数值数据类型,序列数据类型,集合数据类型,字典数据类型,特殊数据类型,其他数据类型

数值数据类型:整数,浮点数,布尔,复数

序列数据类型:字符串,元组,字节序列,列表,字节数组

集合数据类型:集,不可变集

3.2.1 整数(int)

利用进制表示整数

十进制

十六进制:0x(0X)

八进制:0o(0O)

二进制:0b(0B)

范例:

>>>i1=0b100

>>>i1

4

>>>type (i)

<class int>

3.2.2整数对象

>>>int (123)

123

>>>int("123")

123

>>>int("12a")

报错

 

int(x)

int (x,y)

>>>(123.78)

123

>>>('100',2)

4

>>>int (100,2)

报错

前面字符串,后面进制

 

单引号双引号均表示字符串

3.2.4float对象

前导0可以省略

>>>i2=.4

>>>i2

0.4

>>>type (3.14)

<class 'float'>

 

>>>float (124)

124.0

>>>float (3.14)

3.14

>>>float ('123')

123

>>>float ('abc')

报错

3.2.5复数类型

>>>1+2j

(1+2j)

>>>type(1+2j)

<class 'complex'>

实部虚部必须写,j不可以换成其他字母,实部虚部可以是整数或者浮点数

>>>1+j

报错

>>>j

报错

>>>1+2a

报错

>>>1+0j

(1+0j)

>>>0+1j

1j

>>>1+.5j

1+0.5j

>>>.+.j

报错

>>>1+.j

报错

>>>1+1.j

1+1j

不能前导0后导0同时省略

3.2.6 complex对象

complex(x,[y])  y可有可无

>>>c=complex(4,5)

>>>c

4+5j

>>>complex(6)

6+0j

>>>complex(7,)

7+0j

real:实部

imag:虚部

>>>(1+2j). real

1.0

>>>(1+2j).imag

2.0

>>>a=1+2j

>>>b=complex(4,5)

>>>a+b

5+7j

3.2.7布尔类型(bool)

布尔类型的值:True,False(首字母大写)

>>>True

True

>>>type(False)

<class 'bool'>

>>>type(true)

报错

3.2.8 bool对象

bool(x)

>>>bool(True)

True

>>>bool('True')

True

>>>bool(0)

False

>>>bool(1)

True

>>>bool('abc')

True

>>>bool('0')

True

>>>bool(0.0)

False

只要不是数值0,剩下都是True

3.3数据类型转换

显示转换,隐式转换

 隐式转换(自动类型转换)

>>>1+23.4

24.4

>>>123+True

124

>>>123+False

123

显示转换(强制转换)

>>>int(123.4)

123

>>>i=3**2

>>>float(i)

9

>>>a=9999*9999

>>>float(i)

报错

能用隐式不要用显示,显示会形成精度丢失或者异常问题

3.4字符串(str)

字符串的表示有四种方式:

'  '      ,       "  "一行

'''  '''     ,       ""  ""跨行或多行

范例:字符串的拼接

>>>'abc'+'def'

'abcdef'

>>>'abc''def'

'abcdef'

3.5 转义字符

\n  换行

\r  回车

\t  一个水平制表符

\v  一个垂直制表符

\'

\"

\\

\f   换页

\b  退格

范例:

>>>s='a\tb\tc\td\t'

>>>s

'a\tb\tc\td\t'

>>>print (s)

a b c d

>>>s1=r'a\tb\tc\td\t'

>>>s1

'a\\tb\\tc\\td\\t'

>>>print(s)

'a\tb\tc\td\t'

把使用r或R的字符串称为原始字符,该字符串中包含的字符不能将进行转义

3.6str对象

str(x)

范例:

>>>str('abc')

'abc'

>>>str(1230)

'1230'

>>>str(True)

'True'

>>>str(2.12)

'2.12'

3.7运算符

1)算数运算符 +  -  *  /  %  //  **

2)比较运算符 ==   !=    >    <     >=     <=

3)赋值运算符=     +=      -=     *=      /=      %=       **=      //=

//除法,取整(不四舍五入)

**幂运算

%取余

 

 

3.1

>>>a=10

>>>b=20

>>>a and b

20

>>>a or b

10

>>>not(a and b)

false

3.2成员运算符

In,not in

>>>x=abcde

>>>y=e

>>>z=you

>>>y in x

True

>>>z in y

False

>>>z not in x

True

 

3.3身份运算符

用于比较两个对象的存储单元

>>>x='abc'

>>>y=x

>>>z='abcde'

>>>x is y

True

>>>x is z

False

>>>x is not z

True

>>>x ='abc'

>>>y='abc'

>>>x is y

True

 

3.4括号运算符

()

3.5运算符优先级

逻辑型,not,and,or

测试型,is,not is,in,not in

关系型,==   !=    >    <     >=     <=

算数型,+,-,*,/,%,//

3.6 Q&A

问,is与==区别, is是地址比较,==是内容比较(与其他语言相反)

3.7异常

1)

print((3);print(x+'.'+y);

2)运行时错误或异常

primt(3);num1 +=1;print(5/0);

3)逻辑错误

求平均数,average=first+second/2;

正确的:average=(first+second)/2

 

 

我的手机 2018/10/14 18:19:15

 

3.8流程控制语句

分为顺序语句,判断语句(选择语句),循环语句

3.8.1顺序语句

3.8.2选择语句

单分支

if(条件表达式):

                语句

说明,

1)条件表达式:关系表达式,逻辑表达式,算数表达式

2)语句:可以是单个语句,也可以是多个语句,但如果是多个语句,要注意缩进

单个语句

>>>x=5

>>>y=6

>>>if(x>y)冒号没写

报错

多个语句

>>>x=1

>>>y=2

>>>if(x>y):

          print('a')

else:

          print('b')

 

b

 

>>>x=1

>>>y=2

>>>if(x>y):

       print('a')

      else:应该顶上

报错

 

>>>if(x>y):print('a')

else:print('b')

 

b

 

>>>if(x>y): print('a');else:print('b')

报错

无三元运算符

 

多分支

if(条件表达式):

       语句

elif(条件表达式):

      语句

else:

      语句

if的嵌套

if(条件表达式):

       语句

elif(条件表达式):

      语句

else:

      语句

范例:

计算两个数相处的结果,要除数为0时

3.8.3循环语句

         循环分为for循环和while循环

名词解释:

1)可迭代对象:系列,字典,文件对象,迭代器对象,生成器对象

for循环的语法格式:

for  变量 in (对象集合):

>>>for i in (1,2,3,4,5):

             print(i)

1

2

3

4

5

range对象:在Python3中,range对象表示一个迭代器对象,作用是用来产生指定的该迭代器数字序列

在Python2中,range它表示的是一个函数,为生成器。

range(start,stop,[step])

>>>for i in range(1,11,1):

           print(i)

输出1—10

步长为一可以省略,开始数包含,终止数不包含,省略开始数时从0开始输出

>>>for i in range(10):

            print(i,end='  ')

0  1   2…

>>>for i in range(10):

            print(i,end='\t')

0         1         2…

while循环:

while(条件表达式):

       语句

3.8.4循环的嵌套

范例:打印九九乘法表

for i in range (1,10):

      for j in range(1,10):

              print (i,'*',j,'=', i*j,end='\t')

       print('   ')

嵌套不允许超过三层

3.8.5循环跳出

        break,continue

3.8.6死循环

       Ctrl+C:终止当前运行的程序

 

 

3.1 循环else语句

for,while循环语句中可以增加else子句。如果for,while循环没有被break终止,则会执行else子句,否则不循环。

for循环

for 变量 in 对象集合:

     语句

else:

     语句

While循环:

while(条件表达式):

    语句

else:

    语句

haabbies=""

for i in range(1,3+1):

    s=input("请输入爱好之一(最多三次,按Q结束)")

    if s=='Q':

       break

    babbies+=s+' '

else:

    print("你输入了三个爱好")

print("你的爱好为",habbies)

 

3.2空语句

for i in range(5):

        if(i==3):

             pass

             print('执行')

        print(i)

3.3练习

1)用户登录,三次机会

字符串连接最好不要用+号,最好用,号

username=admin

password=123456

for i in range(3):

      user=input('请输入账号')

passwd=input('请输入密码')

if user ==username and passwd==password:

       #print('登录成功,欢迎,admin,的登录')

       print('登录成功,欢迎%s的登录'%(user))

       break

eliif i==2

       print('对不起,你输入出错次数已经是三次了')

else:

       print('帐号与密码不匹配')

2)猜数字

生成随机数方法:

import random

s=random.randint(1,100)

print (s)

 

 

import random

s=random.randint(1,100)

print ('猜数字')

num=input('请输入你猜测的数字'\n)

guess=int (num)

n=0

while n<2:   

      if guess==answer  and  n==0:

            print('你真厉害,一次就猜对了')

            break

      if   guess<answer:

            print('不对,太小了')

     elif   guess>answer:

            print('不对,太大了')

     elif   guess=answer:

            print('对了')

     num=input('请输入你猜测的数字\n')

     guess=int(num)

     n=n+1

     if n==1  and  guess==answer

           print('么么哒,你第二次猜对了')

           break

     elif  n==2 and  guess==answer

           print('你终于第三次猜对了')

           break

print('你太笨了,游戏结束')

3)输入若干个学生的成绩,求出平均值,最大值和最小值

sAvg=0

sCnt=1

sScore=int(input('请输入一个同学的成绩:(-1表示结束)')

sMax=sScore

sMin=sScore

while sScore>=0:

         sAvg=sAvg+sScore

         sCnt=sCnt+1

         if sScore>sMax:

             sMax=sScore

         if sScore<sMin:

             sMin=sScore

         sScore=int(input('请输入一个同学的成绩:(-1表示结束)')

print('计算出来的平均成绩是',sAvg/sCnt)

print('计算出来的最大成绩是',sMax)

print('计算出来的最小成绩是',sMin)

3.4数据结构

数据结构是用来存储和组织数据的方式,表示集合中的一种或多种特定关系

在Python中,常见的数据类型称为容器。序列(列表,元组),映射(字典),集合是三类主要的容器

3.5数组

数组都是一种数据结构,用来存储或者处理大量的数据。在数组中,通过索引下标进行访问操作

在Python中,没有数组这个东西。用系列数据类型来代替数组。

3.6系列数据类型

系列数据类型是python中最简单的数据结构,是一组有顺序的元素的集合。系列数据类型可以包含一个和多个元素,也可以包含空集合(没有元素)

系列数据类型包括:列表,元组,字符串,字节数据

3.7序列

序列的定义:把大量的数据按次序排列起来而形成的集合称为序列

所有的序列类型都可以进行某些特定的操作,这些操作包括:索引,分片,加,乘以及检查某个元素是否属于序列的成员,序列长度,最大元素,最小元素等操作

 

序列分类:按照顺序,有序序列,列表,元组,字符串

                                            无序序列,字典,集合

                      按照序列内容变化,可变序列,列表,字典,集合

                                                              不可变序列,元组,字符串

3.8列表

列表是一组有序项目的数据结构。其中对象可以是任意类型,并不要求类型一致。

列表是数据类型,因此它可以进行添加,删除,修改等操作。

3.8.1列表的创建

字面量创建

        

对象创建

推导式创建

 

 

3.1列表

推导式:专门用来生成满足特定需求的列表

语法格式:

表达式 for 变量 in 序列

范例:

>>>list1=[x*x for x in range(1,10)]

>>>list1

[1,4,9,16,25,36,49,64,81]

>>>list2=[I for I in list1]

>>>list2

[1,4,9,16,25,36,49,64,81]

>>>list3=[I for I in list1 if i%2==0]

>>>list3

[4,16,36,64]

3.2列表的操作

列表的常见操作:索引访问,切片操作,连接操作,重复操作,成员关系操作,比较运算操作,以及求长度,最大值,最小值,求和等等。

3.2.1索引操作

下标只能是整数

>>>list1=[1,2,3,4]

>>>list1[0]

1

>>>list1[-1]

4

>>>list1[9]

index报错

>>>list1['a']

type错误

>>>list1[0]=10

>>>list1

[10,2,3,4]

3.2.2删除列表中的元素

>>>list1=[1,2,3,4]

>>>del list1[1]

>>>list1

[2,3,4]

3.2.3求列表的长度,最大值,最小值,求和

>>>list2=[1,2,3,4,5,6]

>>>len(list2)

6

>>>max(list2)

6

>>>min(list2)

1

>>>sum(list2)

21

注意:max,min,sum在使用时必须是列表中元素类型统一,sum只有是数值求和时才能用

3.2.4切片

截取列表的一部分

s[i:j]

s[i:j:k]

i开始下标,j结束下标,k步长,不包括j

ijk可以省略,格式不能省略

i省略表示从0开始,j省略表示到结尾结束,k省略表示步长为1

超边界不报错

范例:

>>>list5=[1,2,3,4,5,6,7]

>>>list5[1:3]

[2,3]

>>>list5

[1,2,3,4,5,6,7]

>>>list5[:3]

[1,2,3]

>>>list5[:2]=[]

>>>list5

[3,4,5,6,7]

>>>del list5[:1]

>>>list5

[4,5,6,7]

3.2.5连接和重复操作

连接+(只连接不去重)

重复*

>>>list6=[1,2]

>>>list7=[3,4]

>>>list6+list7

[1,2,3,4]

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

>>>list9=[3,4,5]

>>>list8+list9

[1,2,3,3,4,5]

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

>>>3*list10

[1,2,3,1,2,3,1,2,3]

3.2.6成员关系操作

in,not in,count()指定元素在列表中出现的次数,

index(x,[i,j])x指定元素,i开始位置j结束位置指定元素第一次出现的位置下标

>>>list1=[1,2,3,4,5]

>>>3 in list1

True

>>>list2=[1,2,3,3,4,5,3,3,5]

>>>list2.count(3)

4

>>>list2.index(5,5,8)

5

>>>list2.index(2)

1(省略ij,代表从头到尾)

>>>list2.index(9)

报错(如果不在直接报错)

3.2.7比较运算操作

>,>=,<,<=,==,!=逐个进行比较

范例:

>>>list1=['a','b']

>>>list2=['a','b']

>>>list3=['a','b','c']

>>>list4=['c','b','a']

>>>list1=list2

True

>>>

>>>list1<list3

True

>>>list4>list3

True

3.2.8排序操作

sorted()

>>>list5=[6,3,4,2,1]

>>>sorted(list5)

[1,2,3,4,6]

>>>list5

[6,3,4,2,1]

3.2.9 any,all

判断列表中的元素是否为true

>>>any([1,2,0])

True

>>>all([1,2,0])

False

3.2.10列表的遍历

>>>list1=['html','css','js']

>>>for i in list1:

             print('序号:%s 值:%s '%(list1.index(i)+1,i))

序号:1 值: html

序号:2 值:css

序号:3 值:js

>>>for i in range(len(list1)):

               print('序号:%s 值:%s'%(i+1,list1[i]))

3.2.11列表的拆封

>>>ab=[1,2]

>>>a,bc

报错

>>>a,b

(1,2)

>>>a

1

>>>b

2

>>>a,b,c=[1,2]

报错

 

>>> [1,2,3]

[1, 2, 3]

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

>>> temp

[1, 2, 3]

>>> data=[1001,'tom',[80,90,100]]

>>> sid,name,score=data

>>> name

'tom'

>>> sid

1001

>>> score

[80, 90, 100]

>>> sid,name,[chinese,english,math]=data

>>> chinese

80

>>> english

90

>>> math

100

>>> sid

1001

>>> name

'tom'

 

3.2.12列表的解析(推导式)

 

推导式:专门用来生成满足特定需求的列表

语法格式:

表达式 for 变量 in 序列

>>>list3=[I for I in list1 if i%2==0]

 

 

组表达式

>>>i=1

>>>[(i,i*2) for i in range(10)]

[(0,0,),(1,2),(2,4),(3,6),(4,8),(5,10),(6,12),(7,14),(8,16),(9,18)]

>>> x=1

>>> y=2

>>> z=3

>>> [(x,y,x+y+z) for x in range(1,4)]

[(1, 2, 6), (2, 2, 7), (3, 2, 8)]

>>> [(x,y,x+y+z) for x in range(1,4) for y in range(1,4) if x>=y]

[(1, 1, 5), (2, 1, 6), (2, 2, 7), (3, 1, 7), (3, 2, 8), (3, 3, 9)]

 

3.1 元组(定值表)

用来存储固定不变的值表,有序序列。

创建元组的方式:

1.字面量的方式

(x1,x2,,,)

x1,x2,,,,

范例:

>>>t1=(1,2,3,4,5)

>>>t1

(1,2,3,4,5)

>>>t2=1,2,3,4,5

>>>t2

(1,2,3,4,5)

>>>t3=()

>>>t3

()

>>>t4=1

>>>t4

1

>>>t4=1,

>>>t4

(1,)

若元组只有一个元素,需要在元素后加逗号

多个元素也可以加,加不加效果一样

2.对象

tuple()

>>>t7=tuple(1,2,3,4,5)

报错

>>>t7=tuple([1,2,3,4,5])

>>>t7

(1,2,3,4,5)

>>>t8=tuple("abcde")

>>>t8

("a","b","c","d","e")

>>>t2=(1,2,'a')

>>>t2

(1,2,'a')

元素可以不一样

>>>u=('abc')

>>>v=u,(1,2,3)

>>>v

(('a','b','c'),(1,2,3))

>>>v[1][1]=10

报错

元组本身不能变,但是因为类型不同可能会变

>>> a=tuple("abc")

>>> w=a,[1,2,3]

>>> w

(('a', 'b', 'c'), [1, 2, 3])

>>> w[1][1]=10

>>> w

(('a', 'b', 'c'), [1, 10, 3])

 

3.2元组的操作

与列表一样,索引访问,切片操作,连接操作,重复操作,成员关系操作,比较运算操作,求长度,最大值,最小值等等

>>>any((1,2,3))

True

>>>all((1,2,0))

False

>>> t=(1,2,3,4,5)

>>> for x in t:

      print(x)

 

      

1

2

3

4

5

>>> for x in 3.13,5.12,6.77:

      print(x)

 

      

3.13

5.12

6.77

 

>>> t1=(1,2)

      

>>> t2=(1,2)

      

>>> t3=(1,2,3)

      

>>> t1<t2

      

False

>>> t1<=t2

      

True

>>> t=(3,4,6,2,1)

 

>>> sorted(t)

      

[1, 2, 3, 4, 6]

 

>>> data=(1001,"张三",(100,90,89))

      

>>> sid,name,scores=data

      

>>> name

      

'张三'

>>> sid

      

1001

>>> scores

      

(100, 90, 89)

>>> sid,name,(chinese,math,english)=data

      

>>> chinese

      

100

>>> first,middle,last=(1,2,3,4,5,6,7,8,9)

      

Traceback (most recent call last):

  File "<pyshell#29>", line 1, in <module>

    first,middle,last=(1,2,3,4,5,6,7,8,9)

ValueError: too many values to unpack (expected 3)

>>> first,*middle,last=(1,2,3,4,5,6,7,8,9)

      

>>> first

      

1

>>> middle

      

[2, 3, 4, 5, 6, 7, 8]

>>> last

      

9

>>> *first,middle,last=(1,2,3,4,5,6,7,8,9)

      

>>> first

      

[1, 2, 3, 4, 5, 6, 7]

>>> middle

      

8

>>> last

      

9

 

*

 

去掉最高最低求均分

>>> first,*middle,last=sorted((67,56,87,23,45,90))

      

>>> sum(middle)/len(middle)

      

63.75

 

临时变量:_

>>>_,b_=(1,2,3)

>>>b

2

>>>_

3

>>>record=('tom','tom@163.com','0411-123456','123123123')

>>>name,_,*phones

>>>phones

['0411-123456','123123123']

>>>name,phones

('tom',['0411-123456','123123123'])

列表与元组相互转换

>>> t1=(1,2,3,4,5)

      

>>> list1=list(t1)

      

>>> list1

      

[1, 2, 3, 4, 5]

>>> list2=['a','b','c']

      

>>> t2=tuple(list2)

      

>>> t2

      

('a', 'b', 'c')

 

练习,输入一个数字,转换成中文数字

1234567890--->壹贰叁肆伍陆柒捌玖零

 

t1=('零','壹','贰','叁','肆','伍','陆','柒','捌','玖')

num=input('请输入数字'\n)

print(t1[int(num)])

方法一:

chinese_number=('零','壹','贰','叁','肆','伍','陆','柒','捌','玖')

number=input("请输入一个数字")

for i in number:

    print(chinese_number[int(i)])

方法二:

chinese_number=('零','壹','贰','叁','肆','伍','陆','柒','捌','玖')

number=input("请输入一个数字")

dig_number=('0','1','2','3','4','5','6','7','8','9')

print(chinese_number[dig_number.index(number)])

方法三:

chinese_number=('零','壹','贰','叁','肆','伍','陆','柒','捌','玖')

number=input("请输入一个数字")

for i in range(len(number)):

    if "." in number[i]:

        print("点",end=" ")

    else:

        print(chinese_number[int(number[i])],end=" ")

 

字典

创建方式

1)字面量

>>>{'优':90,'良':80}

{'优':90,'良':80}

2)通过dict()方式

>>>dict1=dict([['优':90],['良':80],['中',70]])

>>>dict1

{'优':90,'良':80,'中':70}

把[]都换成()也可以

>>>dict3=dict(zip(['优','良','中'],[90,80,70]))

>>>dict3

{'优':90,'良':80,'中':70}

3)通过fromkeys()方式

4)推导式

键:值 for

>>> dict4={}.fromkeys(['优','良','中'],'大于60分')

>>> dict4

{'优': '大于60分', '良': '大于60分', '中': '大于60分'}

>>> dict5={}.fromkeys(['优','良','中'])

>>> dict5

{'优': None, '良': None, '中': None}

>>> dict6={}.fromkeys(['优','良','中'],None)

>>> dict6

{'优': None, '良': None, '中': None}

>>> dict7={n:n**2 for n in range(1,5)}

>>> dict7

{1: 1, 2: 4, 3: 9, 4: 16}

 

字典的操作

>>> dict3=dict(zip(['优','良','中'],[90,80,70]))

>>> dict3.get('优')

90

>>> dict3.get('差')

>>> dict3.get('差','键不存在')

'键不存在'

>>> dict3.get('优','键不存在')

90

>>> dict3['优']

90

 

items(),keys(),values()

 

>>> dict3.items()

dict_items([('优', 90), ('良', 80), ('中', 70)])

>>> dict3.keys()

dict_keys(['优', '良', '中'])

>>> dict3.values()

dict_values([90, 80, 70])

>>> for i in dict3.values():

print(i,end=",")

 

 

90,80,70,

>>> for i in dict3.items():

print(i,end=",")

 

 

('优', 90),('良', 80),('中', 70),

>>> for i in dict3.keys():

print(i,end=",")

 

优,良,中,

>>> for i in dict3:

print(i,end=",")

 

优,良,中,

 

合并字典update

>>> dict1={'No1':'Java','No2':'c','No3':'Python'}

>>> dict1

{'No1': 'Java', 'No2': 'c', 'No3': 'Python'}

>>> dict1['No4']='VB'

>>> dict1

{'No1': 'Java', 'No2': 'c', 'No3': 'Python', 'No4': 'VB'}

>>> dict1['No4']='php'

>>> dict1

{'No1': 'Java', 'No2': 'c', 'No3': 'Python', 'No4': 'php'}

>>> dict2={'No1':'Java'}

>>> dict3={'No2':'C','No3':'Python'}

>>> dict2.update(dict3)

>>> dict2

{'No1': 'Java', 'No2': 'C', 'No3': 'Python'}

>>> dict4={'No2':'c++'}

>>> dict2.update(dict4)

>>> dict2

{'No1': 'Java', 'No2': 'c++', 'No3': 'Python'}

 

删除元素

del(),pop(),popitem(),clear()

>>>del(dict2['No2'])

>>>dict2

{'No1:'Java','No3':'Python'}

>>>del dict2

>>>del2

报错

>>> dict5={'No1': 'Java', 'No2': 'c', 'No3': 'Python', 'No4': 'VB'}

>>> dict5.pop('No1')

'Java'

>>> dict5

{'No2': 'c', 'No3': 'Python', 'No4': 'VB'}

>>> dict5.pop('No1')

Traceback (most recent call last):

  File "<pyshell#16>", line 1, in <module>

    dict5.pop('No1')

KeyError: 'No1'

>>> dict5.pop('No1','键不存在')

'键不存在'

>>> dict5.popitem()

('No4', 'VB')

>>> dict5.popitem()

('No3', 'Python')

>>> dict5

{'No2': 'c'}

>>> dict5={'No1': 'Java', 'No2': 'c', 'No3': 'Python', 'No4': 'VB'}

>>> dict5.clear()

>>> dict5

{}

 

集合

创建方式:

1)字面量

{值}

值必须是固定的类型,字符串元组之类的,不可以是可变类型

>>>{1.2,True}

{True,1.2}

集合无序

>>>set1={'a',[1,2,3]}

报错

>>>set1={1,(1,2,3)}

不报错

2)通过对象创建    去重

set()参数最多是一个

frozenset()

范例:

>>> set1={'a',[1,2,3]}

Traceback (most recent call last):

  File "<pyshell#0>", line 1, in <module>

    set1={'a',[1,2,3]}

TypeError: unhashable type: 'list'

>>> set1={1,[1,2,3]}

Traceback (most recent call last):

  File "<pyshell#1>", line 1, in <module>

    set1={1,[1,2,3]}

TypeError: unhashable type: 'list'

>>> set1={1,(1,2,3)}

>>> set2=set('hello')

>>> set2

{'o', 'h', 'e', 'l'}

>>> set3=set([1,2,3,4,5])

>>> set3

{1, 2, 3, 4, 5}

>>> set4=set()

>>> set4

set()

>>> set5=set(1,2,3)

Traceback (most recent call last):

  File "<pyshell#9>", line 1, in <module>

    set5=set(1,2,3)

TypeError: set expected at most 1 arguments, got 3

 

3)推导式

>>> a=frozenset('hello')

>>> a

frozenset({'o', 'h', 'e', 'l'})

>>> {x*x for x in range(1,5)}

{16, 1, 4, 9}

>>> {1,True}

{1}

>>> {1,False}

{False, 1}

>>> {1,1.0}

{1}

  

 

3.3集合的操作

>>> set1={1,2,3,6,7,8,5,4,9}

>>> for i in set1:

print(i,end=',')

 

 

1,2,3,4,5,6,7,8,9,

>>> 1 in set1

True

>>> set1={1,2,3}

>>> set2={2,3,4,5,6}

>>> set1

{1, 2, 3}

>>> set1|set2

{1, 2, 3, 4, 5, 6}

>>> set1&set2

{2, 3}

>>> set1-set2

{1}

>>> set1^set2

{1, 4, 5, 6}

>>> set1.union(set2)

{1, 2, 3, 4, 5, 6}

>>> set1==set2

False

>>> set1>set2

False

>>> set1<set2

False

>>> set1

{1, 2, 3}

>>> len(set1)

3

>>> len(set2)

5

>>> max(set2)

6

>>>set1.update(set2) 

{1,2,3,4,5,6}

 

>>>set1={1,2,3,4,5}

>>>set2=set1.copy()

>>>set2

{1,2,3,4,5}

 

>>>set2[0]

报错

因为集合的无序性,不可以做切片操作

 

>>> str1="字符串str的编码和解码操作"

>>> b1=str1.encode(encoding='cp936')

>>> b1

b'\xd7\xd6\xb7\xfb\xb4\xaestr\xb5\xc4\xb1\xe0\xc2\xeb\xba\xcd\xbd\xe2\xc2\xeb\xb2\xd9\xd7\xf7'

>>> b1.decode()

Traceback (most recent call last):

  File "<pyshell#3>", line 1, in <module>

    b1.decode()

UnicodeDecodeError: 'utf-8' codec can't decode byte 0xd7 in position 0: invalid continuation byte

>>> b1.decode(encoding='cp936')

'字符串str的编码和解码操作'

>>> "结果为:%f"%88

'结果为:88.000000'

>>> '姓名:%s,年龄:%d,体重:%3.2f'%('张三',20,56)

'姓名:张三,年龄:20,体重:56.00'

>>> '%(lang)s has %(num)03d quote types.'%{'lang':'Python','num':2}

'Python has 002 quote types.'

>>> '{2},{1},{0}'.format('a','b','c')

'c,b,a'

>>> '{0},{1},{2}'.format('a','b','c')

'a,b,c'

>>> '{2},{1},{0}'.format('a','b')

Traceback (most recent call last):

  File "<pyshell#10>", line 1, in <module>

    '{2},{1},{0}'.format('a','b')

IndexError: tuple index out of range

 

3.1 函数的的定义和调用

 

使用def语句定义函数

def 函数名(参数列表):

        函数体|语句

 

函数名全部为小写字母,可以用下划线(位置有要求,自定义函数位置放中间)

 

>>>def my_average(a,b):

             return (a+b)/2

>>>my_average(1,2)

1.5

>>>def print_start(n):

              print(("*"*n).center(50))                 #  center居中,宽度50

>>>print_start(5)

                       *****

 

练习:定义计算并返回第n阶调和数

(1+1/2+1/3+…1/n)

 

>>>def num(n):

            tmt=0.0

            for i in range(1,n+1):          #取不到n+1

                    tmt=tmt+1.0/(i+1)

            return tmt

 

不同数据类型占的内存大小不一样,但是需考虑涉及大量数据时。

 

3.2类

类的定义

类是一个数据结构

class 类名

      类体

3.3对象的创建和调用

对象名=类名(参数列表)

对象.属性

对象.方法

>>>class Person:

                  def _init_(self, name,age):

                              self.name=name

                              self.age=age

>>>p=Person("Tom",45)

>>>p.name

Tom

>>>p.age

45

>>>class Person:

                  def _init_(self, name,age):

                              self.name=name

                              self.age=age

                  def say_hi(self):

                              print ("你好,我叫",self.name)

>>>p=Person ("Tom",45)

>>>p.say_hi()

你好,我叫Tom

 

定义里带self的叫方法,不带的叫函数

 

>>>class Car:

                 count=0

                 name="aodi"

>>>c=Car()

>>>c.name

"aodi"

>>>Car.name

"aodi"

>>>Car.count+=1

>>>Car.count

1

 

>>>class Person:

                 name="tom"

                 _age=34

>>>Person._age

报错

>>>Person.name

"tom"

>>>class Person:

                 name="tom"

                 _age=34

                 def get_info():

                            print (Person._age)

>>>p=Person ()

>>>p.get_info()

报错

>>>Person.get_info()

34

>>>p._Person__age

34

调用私有属性

对象._类名_ _属性

 

>>>class Person:

                  def _init_(self, name):

                              self._ _name=name

>>>p=Person ("tom")

>>>p.name

报错

>>>p.__name

报错

>>>p._Person__name

"tom"

 

Java:@overload         注解:补充或嵌入一些信息,代码运行

Python:装饰器

 

3.3 @property 装饰器

当作属性出现,而不是方法

属性装饰器    作用类似一个get方法

Property( getter , setter , delete , doc )

>>>class Person:

                  def _init_(self, name):

                              self._ _name=name

                  @property

                  def name(self):

                               return self.__name

>>>p=Person ("tom")

>>>p.name

"tom"

 

>>>class Person:

                  def _init_(self, name):

                              self._ _name=name

                  @property

                  def name(self):

                               return self.__name

                       @name.setter

                  def name(self, value):

                               self.__name=value

                 @name.deleter

                  def name(self):

                               del self.__name

删除的只能是非私有属性,私有属性不能删除。del __name报错

>>>p=Person ("tom")

>>>p.name='allen'

>>>print(p.name)

allen

 

>>>class Person:

                  def _init_(self, name):

                              self._ _name=name

                        def getname(self,name):

                                        return self.__name

                       def setname(self, value):

                               self.__name=value

                  def delname(self):

                               del self.__name

                       name=property(getname,setname,delname,'我是name属性')

>>>p=Person ("tom")

>>>print(p.name)

tom

>>>p.name='allen'

>>>print(p.name)

allen

自定义属性

__getattr__

__getattribute__

__setattr__

__delattr__

>>>class C1:

                pass

>>>o=C1()

>>>o.name='自定义'

>>>print(o.name)

自定义

>>>o.__dict__

{'name':'自定义'}

公有属性

 str.upper(object.__getattribute__(self,name))

                   def __setattr__(self,name,value):

>>>class Person:

                  def _init_(self):

                              pass

                   def __getattribute__(self,name):

                              return object.__setattr__(self,name,atr.strip(value))

>>>o=Person('tom')

>>>

>>>

方法:

实例方法

(对象传参的时候不需要给self

传第一个参数必须是self的方法称为实例方法)

def 方法名称 (self,[参数列表]):

静态方法

 不能对特定的实例进行操作

@staticmethod

def 方法名称([参数列表])

静态方法可以直接用类名调用

类方法

不对特定实例进行操作

@classmethod

 

@classmethod

def 方法名称 (cls,[参数列表]):      cls无需传参,用类名调用

 

>>> class Foo:

classname='Foo'

def __init__(self,name):

self.name=name

def f1(self):

print(self.name)

@staticmethod

def f2():

print('static')

@classmethod

def f3(cls):

print(cls.classname)

 

 

>>> f=Foo('中')

>>> f.f1()

>>> Foo.f2()

static

>>> Foo.f3()

Foo

 

以两个下划线开头的但是不以两个下划线结尾的是私有方法

以两个下划线开头,结尾的是内置方法

 

>>> class Methods:

def publicMethod(self):

print('公有方法')

def __privateMethod(self):

print('私有方法')

def publicMethod2(self):

self.__privateMethod()

 

 

>>> m=Methods()

>>> m.publicMethod()

公有方法

>>> m._Methods__privateMethod()

私有方法

>>> m.publicMethod2()

私有方法

 

对象调用,self无需传参,但是

如果以类名调用时必须传参,传的参数必须是对象

>>>Methods.publicMethod(m)

公有方法

>>>Methods.__Methods__privateMethod(m)

私有方法

 

方法重载。 有争议

最后一个函数把前一个函数覆盖

 

>>> class Person:

def say_hi(self,name):

print('你好,我叫',self.name)

def say_hi(self,name,age):

print('你好,我叫{0},年龄{1}'.format(name,age))

 

 

>>> p=Person()

>>> p.say_hi('tom',23)

你好,我叫tom,年龄23

>>> p.say_hi('allen')

Traceback (most recent call last):

  File "<pyshell#21>", line 1, in <module>

    p.say_hi('allen')

TypeError: say_hi() missing 1 required positional argument: 'age'

 

继承

继承是多继承

class 子类(父类1,父类2…)

子类=派生类,父类=基类

范例:

class Foo:

class Foo(object):

 

继承

继承是多继承

class 子类(父类1,父类2…)

子类=派生类,父类=基类

所有类的父类是object

范例:

class Foo:

class Foo(object):

 

多个父类时建议使用,只有一个时不建议

>>>class Person:

                  def __init__(self, name,age):

                              self.name=name

                              self.age=age

                 def say_hi(self):

                              print("你好,我叫{0},年龄{1}".format(self.name,self.age))

>>>class student(Person):

            def __init__(self, name,age,stu_id):

                        Person.def _init_(self, name,age)

                        self.stu_id=stu_id

           def say_hello(self):

                              Person.say_hi(self)

                              print("我是学生,我的序学号是",self.stu_id)

 

 

一个父类时

>>>class Person:

                  def __init__(self, name,age):

                             self.name=name

                              self.age=age

                 def say_hi(self):

                              print("你好,我叫{0},年龄{1}".format(self.name,self.age))

>>>class student(Person):

            def __init__(self, name,age,stu_id):

                        super(Person,self).__init__(name,age)

                        self.stu_id=stu_id

           def say_hello(self):

                              super(Person,self).say_hi()

                              print("我是学生,我的序学号是",self.stu_id)

 

 

查看类的继承关系

mro(),__mro__

>>> class A:

pass

 

>>> class B(A):

pass

 

>>> class C(B):

pass

 

>>> class D(A):

pass

 

>>> class E(B,D):

pass

 

>>> D.mro()

[<class '__main__.D'>, <class '__main__.A'>, <class 'object'>]

>>> E.__mro__

(<class '__main__.E'>, <class '__main__.B'>, <class '__main__.D'>, <class '__main__.A'>, <class 'object'>)

 

>>> class Dimension:

def __init__(self,x,y):

self.x=x

self.y=y

def area(self):

pass

>>> class Circle(Dimension):

def __init__(self,r):

Dimension.__init__(self,r,0)

def  area(self):

return 3.14*self.x*self.x

>>> class Rectangle(Dimension):

def __init__(self,w,h):

Dimension.__init__(self,w,h)

def area(self):

return self.x*self.y

>>> d1=Circle(2.0)

>>> d2=Rectangle(2.0,4.0)

>>> print(d1.area())

12.56

>>> print(d2.area())

8.0

 

 

>>> class Dimension:

def __init__(self,x,y):

self.x=x

self.y=y

def area(self):

pass

>>> class Circle(Dimension):

def __init__(self,r):

Dimension.__init__(self,r,0)

def __area(self):

return 3.14*self.x*self.x

>>> d=Circle(2.0)

>>> print(d.area())

None

>>> d1=Dimension(2.0,4.0)

>>> print(d1.area())

None

 

 

 

多态

表现,方法的重载与重写,运算符的重载

特殊方法,一个是用来输出,一个是运算符重载

print默认调用__str__

>>> class Person:

def __init__(self,name,age):

self.name=name

self.age=age

def __str__(self):

return "{0},{1}".format(self.name,self.age)

 

 

>>> p=Person('tom',23)

>>> print(p)

tom,23

 

__add__等价于+  

>>> x=1

>>> y=2

>>> x+y

3

>>> class Mylist:

def __init__(self,x,y):

self.x=x

self.y=y

def __add__(self):

for i in range(1,4):

print(i)

 

文件的分类:

1>文本文件

文本文件的操作

1)打开文件

2)操作

3)关闭

ascell码文件,默认编码格式为Unicode

打开文件时,状态为只读模式

open(文件,模式)

open('data1.txt','w')写,存在不报错

open('data2.txt','x')创建文件,存在即报错

open('data3.txt','a')附加模式

写操作

write()把字符串写进(对象不同)

writelines()把列表写进(对象不同)不换行 \n换行

flush()

关闭

close()可以不写

Python语句使用with语句,自动关闭并释放资源

with open('data1.txt','w')as f: 

2>二进制文件

 

文件的操作:

open()

write()

read()

close()

f. close()

       利用with语句进行辅助工作,它的特点是会系统自动关闭然后释放资源

with open(路径,模式) as f:

f:对象的名字

 

写的方法:

write()写字符串

writelines() 写列表

读的方法:

read()从头到尾,返回字符串

readlines()读取多行返回列表

readline()读取一行

 

>>> with open('d:\data1.txt','w') as f:

f.write('123\n')

f.write('456\n')

f.writelines(['abc\n','def\n'])

 

4

4

>>> f=open('d:\data1.txt','r')

>>> f.readline()

'123\n'

>>> f.read()

'456\nabc\ndef\n'

>>> f.readlines()

[]

>>> f=open('d:\data1.txt','r')

>>> f.readline()

'123\n'

>>> f.readlines()

['456\n', 'abc\n', 'def\n']

>>> f.close()

>>>

 

>>> with open('d:\data1.txt','r')as f:

for s in f.readlines():

print(s,end=' ')

 

 

123

 456

 abc

 def

 

>>> import sys

>>> sys.getdefaultencoding()

'utf-8

 

>>> with open(r'd:\data1.txt','r',encoding='utf-8')as f:   

 # r原始字符串,避免转义操作

#最好加上编码集

 

open(file, mode, buffering, encoding, errors, newlines, closed, opener)

utf-8==utf8

 

>>> with open('d:\data2.txt','wb') as f: # wb 写二进制文件

f.write(b'123\n')  # b 区分是二进制文件

 

 

4

>>> with open(r'd:\data2.txt','rb')as f:

b=f.read()

print(b)

 

 

b'123\n'

 

>>> with open('d:\data3.txt','w+b') as f: # w+b 随机文件

f.write(b'123\n')

 

 

4

>>> with open('d:\data3.txt','r+b') as f:

b=f.read()

print(b)

 

b'123\n'

>>>

 

内存文件的操作

在内存中创建临时文件并进行内存的苏区操作

在Python标准库中的IO模块里提供了两个对象来实现文件的读写操作。

StringIO()和BytesIO()

 

>>> from io import StringIO

>>> f=StringIO('hello\nhi\nGoodBye\n')

>>> for s in f:

print(s)

 

 

hello

 

hi

 

GoodBye

 

 

>>> from io import BytesIO

>>> f=BytesIO('中国')

Traceback (most recent call last):

  File "<pyshell#1>", line 1, in <module>

    f=BytesIO('中国')

TypeError: a bytes-like object is required, not 'str'

>>> f=BytesIO(b'中国'.encoding('utf-8'))

SyntaxError: bytes can only contain ASCII literal characters.

 

>>> from io import BytesIO

>>> f=BytesIO()

>>> f.write('中国'.encoding('utf-8'))

6

>>>s=f. read()

>>>print(s)

b''

>>>f. seek(0)

0

>>>s=f. read()

>>>print(s)

b'\xe4\xb8\xad\xe5\x9b\xbd

>>>print(f. getvalue())

b'\xe4\xb8\xad\xe5\x9b\xbd

 

 

Python标准库

中包含下列文件处理的相关模块

Io模块:文件流的输入输出操作模块

bz2模块:读取和写入基于bzip2压缩算法的压缩文件

gzip模块:读取和写入基于gzip压缩算法的压缩文件

zipfile模块:读取和写入基于zip压缩算法的压缩文件

zlib模块:读取和写入基于zlib压缩算法的压缩文件

tarfile模块:读取和写入基于tar格式的卷文件(支持压缩和非压缩)

glob模块:查找符合特定规则的文件路径名

fnmatch模块:使用模式来匹配文件路径名

fileinput模块:处理一个或多个输入文件

filecmp模块:用于文件的比较

csv模块:读取和写入csv格式的文件(excel导入和导出格式)

pickle和cpickle:序列号Python对象

xml包:XML核心处理操作

os模块:基本操作系统功能,包括文件操作

 

import sys,gzip

filename=sys.argv[0]

filenamezip=filename+'.gz'

with gzip.open(filenamezip,'wt')as f:

    for s in open(filename,'r'):

        f.write(s)

for s in gzip.open(filename,'r'):

    print(s)

 

 

csv:逗号分隔符文本格式。用来Excel和数据库进行数据的导入和导出操作。数据间逗号必须是英文逗号

学号,姓名,性别,班级,语文,数学,英语

20180101,张三,男,一班,90,78,98

20180102,李四,女,二班,89,99,67

Csv(逗号分隔符).csv

与创建文本文档改扩展名导致的结果不同

如果是读数据,需要使用的是csv.reader对象            dictreader()

如果是写入数据,则需要使用的是csv.writer对象         dictwriter()

import csv

def readcsv1(csvfilepath):

    with open(csvfilepath,newline='') as f:

        f_csv=csv.reader(f)

        headers=next(f_csv)

        print(heaers)

        for row in f_csv:

            print(row)

if __name__=='__main__':

    readcsv(r'd:\scores.csv')

 

writerow():写入一行数据

writerows():写入多行数据

dialect:只读

 

import csv

def readcsv1(csvfilepath):

    with open(csvfilepath,newline='') as f:

        f_csv=csv.reader(f)

        headers=next(f_csv)

        print(heaers)

        for row in f_csv:

            print(row)

if __name__=='__main__':

    readcsv(r'd:\scores.csv')

 

import csv

def writecsv1(csvfilepath):

    headers=['学号','姓名','性别','班级','语文','数学','英语']

    rows=[('20180101','张三','男','软件一班','90','89','87'),

          ('20180102','李斯','女','软件二班','91','79','86'),

          ('20180103','王五','男','软件三班','92','99','85')]

    with open(csvfilepath,'w',newline='') as f:

        f_csv=csv.writer(f)

        f_csv.writerro(headers)

        f_csv.writerrow(rows)

if __name__=='__main__':

    writecsv1(r'd:\scores.csv')

 

对象序列化(系列化,串行化)

pickle   cpickle

必须进行加密,否则可以才出来内容

序列化:

import pickle

with open(r'd:\bd\dataObject.dat','wb')as f:

    s1='hello'

    s2=1+2j

    s3=(1,2,3)

   s4=dict([['name':Mary],['age':24]])

    pick.dump(s1,f)

    pick.dump(s2,f)

    pick.dump(s3,f)

    pick.dump(s4,f)

反序列化:

import pickle

with open(r'd:\bd\dataObject.dat','rb')as f:

    o1=pickle.load(f)

    o2=pickle.load(f)

    o3=pickle.load(f)

    o4=pickle.load(f)

    print(type(o1),str(o1))

    print(type(o2),str(o2))

    print(type(o3),str(o3))

    print(type(o4),str(o4))

 

 

文件夹的创建与删除

 

remove():删除文件

exists():判断文件或者文件夹是否存在

Path:路径

 

import os

filename='d:\data2.txt'

isExits=os.path.exits(filename)

if isExits:

    os.remove(filename)

    print('文件已删除成功')

else:

    print('要删除的文件不存在')

          

mkdir():创建一级文件夹

Makedirs():创建多级文件夹

 

import os

dirname=r'd:\pythontest'

multipledirname=r'd:pythontest1\program\test'

isExits=os.path.exits(dirname)

if isExits:

    print(dirname,'文件夹已存在')

else:

    os.mkdir(dirname)

    print('已经成功创建了一个文件夹')

isExits=os.path.exits(multipledirname)

if isExits:

    print(multipledirname,'文件夹已存在')

else:

    os.makedirs(multipledirname)

    print('已经成功创建了一个文件夹')

 

Rmdir():只能删除空文件夹

如果想要删除非空文件夹,那么需要使用shutil中的rmtree()

 

import os

import shutil

dirname=r'd:\pythontest'

multipledirname=r'd:pythontest1\program\test'

isExits=os.path.exits(dirname)

if isExits:

    os.rmdir(dirname)

    print('成功删除文件夹')

else:

    print('要删除的文件夹不存在')

isExits=os.path.exits(multipledirname)

if isExits:

   shutil.rmtree(multipledirname)

    print('成功删除文件夹')

else:

    print('要删除的文件夹不存在')

 

批量创建文件夹

import os,sys

def genDir():

    base=r'd:/bd/train/train1/'   # 多级文件夹采用反斜杠

    i=1

    for j in range(100):

        file_name=base+str(i)

        os.mkdir(file_name)

        i=i+1

if __name__=='__main__':

    genDir()

 

创建指定名字的文件夹

Listdir():返回指定目录下的所有文件或文文件夹

import os,sys

path1=r'c:\101test'

path2=r'd:/bd/train/train1/'

def mkDir():

    ------没抄下来    

    dirs = os.listdir(path1);

    for dir in diers:

        file_name = path2 +dir

        os.mkdir(file_name)

 

if __name__=='__main__':

    mkDir()

 

根据指定路径的文件夹内容创建文件夹        

import os

bathpath=r'd:/bd/train/train1/'

for line in open(r'c:/101test/ab.txt'):

    basename=line.strip()

    folder=os.path.join(basepath,basename)

    filename=os.path.join(folder,basename)

    os.mkdir(folder)

    open(filename,'w').close()

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值