首页 > 技术文章 > day two Python学习之列表、元组、字典、流程控制、文件处理和函数

zhenwu 2019-06-25 21:24 原文

一  列表

列表的定义:在[ ]内可以有多个任意类型的值,逗号分隔。列表与数组类似,也有一维、二维和三维的。

students = ['kermit','alex','wupeiqi',]
students(['kermit','alex','wupeiqi',])
students = list(['kermit','alex','wupeiqi',])
#列表的三种定义形式
students1 = ['james','man',18,['sing','basketball','tiao','rap']]#二维列表
#students1[0][0]='james';students1[1][0]='man';students1[2][0]=18;
#students1[3]=['sing','basketball','tiao','rap']
print(students1[3][2])#可以得到tiao
students_info=[['kermit',18,['play',]],['alex',18,['play','sleep']]]#三维列表
#['kermit',18,['play',]属于三维数组第一格,'kermit',18,['play',]属于第二格,'play'属于第三格
print(students_info[1][2][1])#sleep
列表的各项操作:
  1、按索引存取值(正向存取+反向存取):即可存也可以取     
  2、切片(顾头不顾尾,步长)
  3、长度
  4、成员运算in和not in
  5、追加
  6、删除
  7、循环
  8、使用index查找列表中某个值的索引
  9、pop取值,默认取列表中的最后一个值,类似删除,如果pop()括号中写了索引,则取索引对应的值
  10、删除remove
  11、插入值insert
  12、extend 合并列表
students1 = ['james','man',18,['sing','basketball','tiao','rap']]
students = ['kermit','alex','wupeiqi',]
#按索引取值(正向和反向)
print(students[1])#alex
print(students[-1])#wupeiqi
#切片,顾头不顾尾,步长
print(students1[0:4:2])#['james', 18]
#长度len 成员运算in和not in
print(len(students1))4
print('18' in students1)#True
print('18' not in students1)#False
#追加
students1.append('haohen,666')#['james', 'man', 18,
#['sing', 'basketball', 'tiao', 'rap'], 'haohen,666']
print(students1)
#删除
del students1[3]#删除列表中索引为3的值
print(students1)#删除了['sing', 'basketball', 'tiao', 'rap']
#index 查找列表中某个值的索引
print(students1.index(18))#18的索引是2
#获取列表中某个值的数量 count
print(students1.count(18))#只有1个18,数量为1
#取值,默认取列表中的最后一个值,类似删除,如果pop()括号中写了索引,则取索引对应的值
print(students1.pop())#取完以后值已离开原列表 'haohen,666'
print(students1.pop(1))#man
#删除remove
students1.remove(18)#需要在括号内写入想要移除的量的值
print(students1)
#插入值
name = ['胖虎','蔡恩','sf no1']
name.insert(2,'best')#把best插入到索引2处
print(name)
#extend 合并列表
name2 = ['巴雷特','新秀分位','nice']
name.extend(name2)#将name2放在name之后
print(name)
#循环
for line in name:
    print(line)#循环输出元素

 二  元组

作用:存多个任意类型的值,对比列表来说,元组不可变(是可以当做字典的key的),主要是用来读。
定义:与列表类型比,只不过[ ]换成( )。
例如:age=(11,22,33,44,55)本质age=tuple((11,22,33,44,55))
元组的操作:
      1、按索引取值(正向取+反向取):只能取  
      2、切片(顾头不顾尾,步长)
      3、长度
      4、成员运算in和not in
      5、循环
age = (17,16,15,'十八')
#1、按索引取值(正向取+反向取):只能取
print(age[2])#15
#2、切片(顾头不顾尾,步长)
print(age[0:4:2])#(17, 15)
#3、长度len
#4、成员运算in和not in
#5、循环
for line in age:#print会默认end为\n,进行换行,可以通过改变end的值来对此特性进行修改
    print(line,end=' ')

三  字典

注:不可变类型:变量的值修改后,内存地址一定不一样。整型,浮点型,元组,字符串
可变类型:值修改后,内存地址不变。列表,字典
#作用:存多个值,key-value存取,取值速度快

#定义:key必须是不可变类型,value可以是任意类型
info={'name':'kermit','age':18,'sex':'male'} #本质info=dict({....})
或
info=dict(name='kermit',age=18,sex='male')
或
info=dict([['name','kermit'],('age',18)])
或
{}.fromkeys(('name','age','sex'),None)
字典的操作:
  1、按key存取值:可存可取
  2、长度len
  3、成员运算in和not in
  4、删除
  5、键keys(),值values(),键值对items()
  6、循环
  7、get使用
dict({'name': 'panghu', 'age': 19})
dict1 = {'name': 'panghu', 'age': 19}
# 1
print(dict1['name'])#panghu
dict1['level'] = 9  # 存一个'level': 9到字典中
print(dict1)#{'name': 'panghu', 'age': 19, 'level': 9}
#2 3
print(len(dict))
print('name' in dict1)#True
print(19 in dict1)#value进行成员运算只能得到False
#4del
del dict1['level']
print(dict1)#{'name': 'panghu', 'age': 19}
#5 键keys(),值values(),键值对items()
#得到字典中的所有key
print(dict1.keys())#dict_keys(['name', 'age'])
#得到字典中的所有values
print(dict1.values())#dict_values(['panghu', 19])
#得到字典中的所有items
print(dict1.items())#dict_items([('name', 'panghu'), ('age', 19)])
#6循环
for key in dict1:
    print(key)#只能得到name和age,就是key
    print(dict1[key])#得到panghu和19,就是value
#get
print(dict1.get('age'))#用get找不到会提示不存在输出None(better)
print(dict1['age'])#用中括号找不到直接报错
#如果找不到sex,为其设置一个默认值
print(dict1.get('sex','male'))#默认值并不会写入到dict1中,只是得到一个结果
print(dict1.get('name','male'))#如果可以找到name,直接无视默认值

 四  流程控制

if...else语句的使用

x = 5
y = 10
if x > y:
    print(x)
elif x == y:
    print('same')
else:
    print(y)

while语句中,continue结束本次循环,进入下一次;break 跳出循环。格式如下

while True:#使用True实现无限循环,直到break
    name = input('请输入猜测的字符:').strip()
    if name == 'tank':
        print('tank success!')
        break
    print('请重新输入!')

num = 0
while num<3:#使用num来实现有限次的循环
        name = input('请输入猜测的字符:').strip()
        if name == 'tank':
            print('tank success!')
            break
        print('请重新输入!')
        num+=1

嵌套循环与tag

tag=True 

  while tag:

    ......

    while tag:

      ........

      while tag:

        tag=False

while与else

#与其它语言else 一般只与if 搭配不同,在Python 中还有个while ...else 语句,while 后面的else 作用是指,当while 循环正常执行完,中间没有被break 中止的话,就会执行else后面的语句
count = 0
while count <= 5 :
    count += 1
    print("Loop",count)

else:
    print("循环正常执行完啦")
print("-----out of while loop ------")
输出
Loop 1
Loop 2
Loop 3
Loop 4
Loop 5
Loop 6
循环正常执行完啦
-----out of while loop ------

#如果执行过程中被break啦,就不会执行else的语句啦
count = 0
while count <= 5 :
    count += 1
    if count == 3:break
    print("Loop",count)

else:
    print("循环正常执行完啦")
print("-----out of while loop ------")
输出

Loop 1
Loop 2
-----out of while loop ------

for循环:

1 迭代式循环:for,语法如下

  for i in range(10):

    缩进的代码块

2 break与continue(同上)

3 循环嵌套

for i in range(1,10):
    for j in range(1,i+1):
        print('%s*%s=%s' %(i,j,i*j),end=' ')
    print()
#分析
'''

             #max_level=5
    *        #current_level=1,空格数=4,*号数=1
   ***       #current_level=2,空格数=3,*号数=3
  *****      #current_level=3,空格数=2,*号数=5
 *******     #current_level=4,空格数=1,*号数=7
*********    #current_level=5,空格数=0,*号数=9

#数学表达式
空格数=max_level-current_level
*号数=2*current_level-1

'''

#实现
max_level=5
for current_level in range(1,max_level+1):
    for i in range(max_level-current_level):
        print(' ',end='') #在一行中连续打印多个空格
    for j in range(2*current_level-1):
        print('*',end='') #在一行中连续打印多个空格
    print()

打印金字塔

 五  文件操作

执行python文件的过程:
    1、先启动python解释器,加载到内存中
    2、把写好的python文件加载到解释器中
    3、检测python语法,执行代码
    SyntaxError:语法错误;
打开文件会产生两种资源:
    1、python程序
    2、操作系统打开文件

利用文件处理open( )来写文件,读文件,追加写文件
wt,写文本;rt ,读文本;at,追加文本。注:必须指定字符编码,以什么方式写就得以什么方式打开
参数一:文件的绝对路径
参数二:mode操作文件的模式
参数三:encoding 指定的字符编码

对于参数三,encoding主要有以下几种赋值:

  UTF-8以字节为单位对Unicode进行编码。
  UTF-16编码以16位无符号整数为单位。
  UTF-32编码以32位无符号整数为单位。

# 写文本文件
f = open('file.txt', mode='wt', encoding='utf-8')  # 操作系统打开文件
f.write('tank')
f.close()  # 关闭操作系统文件资源
# 读文本文件
f = open('file.txt', 'r', encoding='utf-8')  # r就是rt
print(f.read())
f.close()
# 追加写文本文件
a = open('file.txt', 'a', encoding='utf-8')
a.write('\n 6666')
a.close()

在执行上述程序后可以得到一个file.txt文本文档,在文本文档内写有haohen6666。

对文档进行操作还有其它的程序表示方法,以下的操作可以省去close()语句的使用。

文件处理之上下文管理:#with可以管理open打开的文件,
#会在with执行完毕后自动调用close()关闭文件,具体就是使用with open()语句
with open('file.txt', 'w', encoding='utf-8') as f:  # with open()as f:句柄
    f.write("haohen")
with open('file.txt', 'r', encoding='utf-8') as f:  # with open()as f:句柄
    res = f.read()
    print(res)
with open('file.txt', 'a', encoding='utf-8') as f:  # with open()as f:句柄
    f.write("666")
#程序执行完后可在文本文档中写入haohen666

除了文本文档,也可以对图片,视频,音频读写,在rb和wb模式下,直接读取二进制,不需要指定字符编码。 

#读取图片
with open('cxk.jpg','rb') as f:
    res = f.read()
    print(res)
jpg=res
#把cxk.jpg的二进制流写入cxk_copy.jpg文件中
with open("cxk_copy.jpg",'wb') as f_w:
    f_w.write(jpg)
#通过这个程序,可以得到与cxk.jpg一模一样的cxk_copy.jpg

 以上程序也可以利用with语句来进行描述

#with管理多个文件
#通过with来管理open打开的两个文件句柄f_r,f_w
with open('cxk.jpg','rb') as f_r,open("cxk_copy.jpg",'wb') as f_w:
    res = f_r.read()
    f_w.write(res)
#程序最终结果是与上面的那个程序运行结果一致,而且减少了代码行数

 六  函数

什么是函数?函数是一把工具

'''
    - 事先准备工具的过程----> 函数的定义

    - 把工具拿过来使用----> 函数的调用

    - 所以函数的使用必须遵循: ----> 先定义,后调用
'''

使用函数的好处:

  1、解决代码冗余的问题;

  2、使代码的结构更清晰;

  3、易于管理。遵循先定义后调用。

函数的三种形式:

#1、无参:应用场景仅仅只是执行一些操作,比如与用户交互,打印
#2、有参:需要根据外部传进来的参数,才能执行相应的逻辑,比如统计长度,求最大值最小值
#3、空函数:设计代码结构

形参与实参

#形参即变量名,实参即变量值,函数调用时,将值绑定到变量名上,函数调用结束,解除绑定

 函数的定义形式:

def 函数名(参数1,参数2,参数3,...):
    #文档描述
    函数体代码1
    函数体代码2
    ...
    return 返回的值

1.def(即defind,翻译过来是定义!): 是声明函数的关键字。
2.函数名: 用来调用函数的。函数的命名应该尽量反应出其代表的功能。也就是看其名知其意!
3.(): 括号内是函数的参数,函数的参数可以有一个或者多个。
#4.注释/: 推荐写上,增强函数的可读性!
5.函数体: 具体的逻辑代码。
6.return: 函数返回的值。
def name():
    print('666')
print(name)#函数的内存地址
name()#函数调用
#参数的参数
def name1(a,b):#在定义时a和b称之为形参
    c = input().strip()
    d = input().strip()
    if c==a and d==b:
        print('nice')
    else:
        print('bad')
name1('1','2')#在调用阶段:1,2称为实参
#空函数的简单举例
def aa():
    pass
'''
位置参数:
    位置形参
    位置实参
    必须按照位置一一传参
'''
#在定义阶段:位置形参
def func(x,y):
    print(x,y)
func(10,100)#在调用阶段:10,100称位置实参
'''
关键字参数:
    关键字实参
    按照关键字传参
'''
def func(x,y):#位置形参x,y
    print(x,y)
func(x=10,y=100)#在调用阶段:x=10,y=100称之为关键字参数
#func(x=10) func(x=10,y=100,z=999)不能少传和多传,会报错
'''
默认参数:
    在定义阶段,为参数设置默认值
'''
def foo(x=10,y=20):
    print(x,y)
foo()#不传参,则使用默认参数
foo(200,300)#传参,使用传入的参数
函数的嵌套定义:在函数内部定义函数。
函数对象:函数的内存地址称之为函数对象
函数的名称空间:
    内置:python解析器自带的都称之为“内置名称空间”。
    全局:所有顶着头写的变量、函数。。。都称之为“全名称空间”。
    局部:在函数内部定义的,都称之为“局部名称空间”
    名称空间加载顺序:内置--》全局--》局部
    名称空间查找顺序:局部--》全局--》内置
#函数的嵌套的定义
def a():
    print('1')
    def b():
        print('2')
#函数对象
print(a)
def f1():
    pass
def f2():
    pass
dic1={'1':f1,'2':f2}
choice = input('请选择功能编号:')
if choice== '1':
    print(dic1[choice])
    dic1[choice]()
elif choice== '2':
    print(dic1[choice])
    dic1[choice]()
x=10
#名称空间
#函数的嵌套定义
def func1():
    #x=20
    print('from func1...')
    print(x)
    #x=30,代码自上而下执行,会报错
    def func2():
        print('from func2...')
func1()

 应用

#1、位置参数:按照从左到右的顺序定义的参数
        位置形参:必选参数
        位置实参:按照位置给形参传值

#2、关键字参数:按照key=value的形式定义的实参
        无需按照位置为形参传值
        注意的问题:
                1. 关键字实参必须在位置实参右面
                2. 对同一个形参不能重复传值

#3、默认参数:形参在定义时就已经为其赋值
        可以传值也可以不传值,经常需要变得参数定义成位置形参,变化较小的参数定义成默认参数(形参)
        注意的问题:
                1. 只在定义时赋值一次
                2. 默认参数的定义应该在位置形参右面
                3. 默认参数通常应该定义成不可变类型


#4、可变长参数:
        可变长指的是实参值的个数不固定
        而实参有按位置和按关键字两种形式定义,针对这两种形式的可变长,形参对应有两种解决方案来完整地存放它们,分别是*args,**kwargs

        ===========*args===========
        def foo(x,y,*args):
            print(x,y)
            print(args)
        foo(1,2,3,4,5)

        def foo(x,y,*args):
            print(x,y)
            print(args)
        foo(1,2,*[3,4,5])


        def foo(x,y,z):
            print(x,y,z)
        foo(*[1,2,3])

        ===========**kwargs===========
        def foo(x,y,**kwargs):
            print(x,y)
            print(kwargs)
        foo(1,y=2,a=1,b=2,c=3)

        def foo(x,y,**kwargs):
            print(x,y)
            print(kwargs)
        foo(1,y=2,**{'a':1,'b':2,'c':3})


        def foo(x,y,z):
            print(x,y,z)
        foo(**{'z':1,'x':2,'y':3})

        ===========*args+**kwargs===========

        def foo(x,y):
            print(x,y)

        def wrapper(*args,**kwargs):
            print('====>')
            foo(*args,**kwargs)

#5、命名关键字参数:*后定义的参数,必须被传值(有默认值的除外),且必须按照关键字实参的形式传递
可以保证,传入的参数中一定包含某些关键字
        def foo(x,y,*args,a=1,b,**kwargs):
            print(x,y)
            print(args)
            print(a)
            print(b)
            print(kwargs)

        foo(1,2,3,4,5,b=3,c=4,d=5)
        结果:
            2
            (3, 4, 5)
            3
            {'c': 4, 'd': 5}

此乃重点知识!!!

 

推荐阅读