zoukankan      html  css  js  c++  java
  • python7、8章

    第七章 用户输入和while循环

    7.1 函数input()的工作原理

    函数input()会让程序暂停一会,等待用户输入一些文本。获取用户输入的文本后,python将其存储在一个变量中,以方便我们使用。

    image-20210119141419921

    函数input()接收一个参数:即要向用户显示的提示或说明,让用户知道如何做。输入变量存储在message。

    7.1.1 编写清晰的程序

    image-20210119141838661

    可以在冒号后面空格,让用户清除从哪开始的。

    image-20210119142216885

    上面的图演示了一种创建多行字符串的方式。第一行将消息的前半部分存储在变量nn中;在第二行,运算符+=在存储在nn中的字符串末尾附加字符串(自己理解感觉像C语言的+=。就是nn=前半部分+后半部分我们输入的)

    7.1.2 使用int()来获取数值输入
    分析:

    使用函数input()时,python将用户的输入解读为字符串。

    image-20210119142707996

    我们输入21,python提供值时,返回的时‘21’,但如果按照之前的判断,应该出现false,但是却报错,因为python无法将字符串和整数进行比较,所以字符‘21’不能和19比较

    结果:

    所以我们可以使用int()函数,他会让python输入的为数值。

    函数int()将数字的字符串转化为数值表示。

    image-20210119143206940

    image-20210119143606146

    把它运用到现实生活中。。。

    7.1.3 求模运算符

    处理数值信息,求模运算符(%)是好用的工具。就是相除返回余数

    image-20210119143841346

    制作一个求模的方案:

    image-20210119144318318

    输入的时候忘记了“+str(shu)+”。。。。。

    msg = input("请输入您要租赁的汽车名称:")
    print("Let me see if I can find you a " + msg)

    感觉这样的不用加也行在末尾。。感觉好简便,打脸了。。。。

    7.1.4 在python2.7中获取输入

    不是用input(),使用函数raw_input()来提示用户输入。并且与python3的一样,将输入解读为字符串。

    7.2 while循环简介

    for循环用于针对集合的每个元素的一个代码块,而while循环不断地运行,知道不满足。

    7.2.1 使用while循环

    image-20210119145241196

    不解释。。。

    7.2.2 让用户选择何时退出

    image-20210119160034392

    只有输入quit才可以退出,不然就一直循环

    我们创建了一个变量--message,让python首次执行while代码行时有可检查的东西。python首次执行while语句时,需要将message的值与‘quit’比较。

    进一步修改美化,让quit消息不打印出来。

    image-20210120121821869

    而是直接退出。

    7.2.3 使用标志

    在要求很多条件都满足才能继续运行的程序中,可定义一个变量,用于判断整个程序是否处于活动状态。这个变量被称为标志

    它可以控制程序是否可以进行。

    image-20210120122458997

    用active作为标志,(ture,false首字母必须大写,别能小写,不然会报错。)如果用户输入‘quit’,我们就将变量active设置为False,这就会导致while循环不再执行。

    7.2.4 使用break退出循环

    要立即退出while循环,不再运行循环中余下的代码,不管条件测试结果如何,可使用break。

    image-20210120123252581

    以while Ture开头的循环,只有遇到break才会停。

    在这个程序中,只有输入quit才可以终止当前的循环。以至于python退出循环。


    brwak语句也可以用来退出遍历列表或字典的for循环。

    7.2.5 在循环中使用continue

    要返回到循环开头,并根据条件测试结果决定是否继续执行循环。

    不像break直接跳出循环,它是跳过,类似C语言的continue

    1到10的奇数:

    image-20210120123902252

    不解释。。。

    7.2.6 避免无线循环

    x=1

    while x <5 :

    print(x)

    如果在正在循环中,可以用ctrl+c,也可以关闭显示程序输出的终端窗口

    image-20210120133624159

    这是一道习题,之前一直都是用msg变量,不变,就会出现上一回的输入值在下一循环中,所以要用两个变量。。

    7.3 使用while循环来处理列表和字典

    通过将while循环同列表、字典结合在一起,可收集、存储并组织大量输入,以供以后查看和显示。

    7.3.1 在列表之间移动元素

    image-20210120141322508

    不解释。。。

    7.3.2 删除包含特定值的所有列表元素

    在第三章,用方法remove()删除特定值,要删除列表中的所有包含特定值的元素需要---

    用while循环再附加方法remove()

    image-20210120141852686

    直到列表中不再次出现remove的值,就停止循环。

    7.3.3 使用用户输入来填充字典

    image-20210120144310980

    结果

    image-20210120144325751

    看着这一题,有点迷惑,在问过大佬之后,明白了。

    在responses[name]中,我们只添加了变量name的输入值给字典,为啥会在倒数第二行有name和response的用法,这里我迷了,因为字典的不熟悉掌握,在重新看一遍后,知道了,键-值对。。。。。。。。。。。。。。。。。。。。

    第八章 函数

    函数就是带名字的代码块,用于完成具体的工作。

    最喜欢这一章了,感觉很有意思,哈哈哈哈,呜呜呜呜

    C4EA56C61519D2913C0B9D7B4D29C956

    8.1 定义函数

    image-20210121113008398

    这是一个简单的函数结构,第一行的代码使用关键字def告诉python你需要定义一个函数。然后向python指出了函数名。在这儿,函数名为greet(),它不需要任何信息就能完成其工作,因为kuohaoshikongde(即便是这样,也不能少括号),最后,定义以冒号结尾

    感觉类似C语言的定义宏那样

    紧跟在def gret():后面的缩进成了函数体,greet()只工作一项:打印cao。。。。。。

    要使用这个函数,首先我们需要调用它。

    要调用函数,必须依次指定函数名和括号括起来的信息。

    8.1.1 向函数传递信息

    image-20210121113832474

    在括号里面添加name,就可以让函数接受你给的name指定的任何值。现在,这个函数要求我们调用它是给name指定一个值。

    调用greet()时,可以将一个名字传递给他。就像上面的一样。

    代码greet('youxiu')调用函数greet(),并向他提供执行print语句所需要的信息。

    调用时无论传输什么名字,都会生成相对应的输出。

    8.1.2 实参和形参

    在上面的距举例中,变量name是一个形参--函数完成其工作所需一项信息。

    在代码greet('youxiu')中,'youxiu'是一个实参。

    实参是调用函数是传递给函数的信息。

    原理:我们调用函数,将要让函数使用的信息存放在括号内。在greet('youxiu')中,将实参'youxiu'传递给函数greet(),这个值被存储在形参name中。

    也可以在def那里,定义两个形参

    image-20210121125854038

    8.2 传递实参

    8.2.1 位置实参

    位置实参

    调用函数时,python必须将函数调用中的每个实参都关联到函数定义中的一个形参,因此,最简单的关联方式是基于实参的顺序。

    image-20210121130718870

    容易出错的地方:忘记def末尾后的:冒号

    实参的引号

    1.调用函数多次

    在下一行接着按照最后一行的这样的格式输入就行

    在函数中,可根据需要使用任意数量的位置实参,python将按照顺序将函数调用中的实参关联到函数定义中的相应的形参。

    2.位置实参的顺序很重要

    确认函数调用中实参的顺序与函数定义中的形参的顺序一样。

    8.2.2 关键字实参

    关键字实参:

    是传递给函数的名称-值对。可以直接在实参中将名称与值关联起来,因此向函数传递实参时不会混淆。

    2948B6D51C46E630EC3CC578603E4C87image-20210121131531859

    关键字实参的顺序无关紧要,因为python知道各个值该存储到那个形参中。所以是等效的在上面的图中。

    务必要准确的指出函数定义的形参名

    8.2.3 默认值

    编写函数时,可以给每个形参指定默认值。在调用函数中给形参提供了实参时,python将使用指定的实参值;否则,将使用形参的默认值。

    image-20210121132120000

    调用这个函数,如果没有给它指定值,python就把这个形参设置为beibei

    想上面的我们只用了一个实参的dog,在没有特殊声明的情况下,都是按照顺序来实参对应形参,所以name的形参就是默认值。

    8.2.4 等效的函数调用

    使用哪种都一样,符合自己的习惯就行,我感觉当形参少时,用简约的’‘,多的话就用形参名子的那个。

    8.2.5 避免实参错误

    当提供的实参多或者少于函数完成其工作所需的信息时,将出现实参不匹配。

    image-20210121133036045

    python发现该函数调用缺少必要的信息,而traceback指出了这一点

    第二行指出问题所在地

    第三行指出函数调用出现了问题

    第四行说我们少了两个实参,并指出了相应的形参的名称。

    8.3 返回值

    函数并不是直接显示输出,有时,它可以处理一些数据,返回一个、组的值。函数返回的值称为返回值。。。

    BEE244B6F6DEEC0F11D48D8414C0A2B9

    8.3.1 返回简单值

    image-20210121135109714

    这个输出Chen Youxiu

    在需要分别存储大量名和姓的程序中,像这样的函数灰常好用,

    8.3.2 让实参变成可选的

    image-20210121141214952

    image-20210121141227279

    有时只提供了now,last,没有提供lasted,他将会不能正常的运行。通过等于lasted=’ ‘来让其变成可选,可给其值提供一个默认值,空字符串,并在用户不输入的时候使用这个实参。

    可选值让函数能够处理各种不同情况的同时,确保函数尽可能地调用

    8.3.3 返回字典

    image-20210121142855372

    person()接受now和last,并将这些值封装到字典中。存储在now时,使用键’now‘。。最后原来的两项文本信息存储在一个字典中

    8.3.4 结合使用函数和while循环

    image-20210121144146602

    对这个代码的解释:可以把前三行当成一个代码块,就是把下面输入的实参变成首字母大写,并加起来。

    下面用了一个无限循环,当输入q才会停止。前三行的结果给了全名,然后打印

    编写一个名为make_album() 的函数, 它创建一个描述音乐专辑的字典。 
    # 这个函数应接受歌手的名字和专辑名, 并返回一个包含这两项信息的字典。 使用这个函数创建三个表示不同专辑的字典, 
    # 并打印每个返回的值, 以核实字典正确地存储了专辑的信息。给函数make_album() 添加一个可选形参, 
    # 以便能够存储专辑包含的歌曲数。 如果调用这个函数时指定了歌曲数, 就将这个值添加到表示专辑的字典中。 调用这个
    # 函数, 并至少在一次调用中指定专辑包含的歌曲数。
    
    def make_album(singer_name,album_name,song_number = ''):
    	if song_number:
    		s_a =  {'singer_name':singer_name,'album_name':album_name,'song_number' : song_number}
    	else:
    		s_a = {'singer_name':singer_name,'album_name':album_name}
    	return s_a
    a = make_album('HanHong','QingZangGaoYuan','5')
    b = make_album('AndiLiu','WangQingShui')
    c = make_album('LiuHuan','YouAndMe','7')
    print(a)
    print(b)
    print(c)
    
    # 8-8 用户的专辑 : 在为完成练习8-7编写的程序中, 编写一个while 循环, 让用户输入一个专辑的歌手和名称。 
    # 获取这些信息后, 使用它们来调用函数make_album() , 并将创建的字典打印出来。 在这个while 循环中, 务必要提供退出途径。
    
    def make_album(singer_name,album_name,song_number = ''):
    	if song_number:
    		s_a =  {'singer_name':singer_name,'album_name':album_name,'song_number' : song_number}
    	else:
    		s_a = {'singer_name':singer_name,'album_name':album_name}
    	return s_a
    
    s_n_inp = '请输入歌手名:(输入’quit‘后退出)'
    a_n_inp = '请输入专辑名:(输入’quit‘后退出)'
    ac = True
    while ac:
    	a = input(s_n_inp)
    	b = input(a_n_inp)
    	if a == 'quit' or b == 'quit' :#前面感觉也可以用,忘了用了。。。。。。
    		break#或者ac=False也可以。。
    	else:
    		c = make_album(a,b)
    		print(c)
    

    8.4 传递列表

    将列表传递给函数后,函数就能直接访问其内容。

    image-20210122111836744

    我们将greet()定义成接收的列表,并将其存储在names中。这个函数遍历收到的列表,并对其中的每一位用户都打印一条问候语。

    出错点:关键字def最后面忘记加:

    for缩进

    8.4.1 在函数中修改列表

    讲的就是分步函数,即每个函数都对应负责一项具体的工作。有两个,这样优于使用一个函数来完成工作。并且类似C语言指针的调用,这有助于键更复杂的任务划分成一系列的步骤。

    8.4.2 进制禁止函数修改列表

    有时候,需要禁止函数修改列表。可向函数传递列表的副本而不是原件;这样函数所做的任何修改都只影响副本,丝毫不影响原件。

    要将列表的副本传给函数

    function_name(list_name[:])

    切片表示法[:]创建列表的副本。

    这一节有点迷。。。

    4728609883431DEEAB3A45D31024FA69

    迷归来了,虽然向函数传递列表的副本可保留原始列表的内容,但除非有充分的理由传递副本,否则还是应该将原始列表传递给函数,因为让函数实现现成列表可以避免花费时间和创建副本。

    # 8-10 了不起的魔术师 : 在你为完成练习8-9而编写的程序中, 编写一个名为make_great() 的函数, 
    # 对魔术师列表进行修改, 在每个魔术师的名字中都加入字样“theGreat”。 调用函数show_magicians() , 确认魔术师列表确实变了。
    
    name_list = ['mag1','mag2','mag3']
    name_change = []
    def make_great(name_list,name_change):
    	while name_list:
    		cur = name_list.pop()
    		cur = 'thegreat' + cur
    		name_change.append(cur)#上面是对name——list和name——change的转移
    	
    def show_magicians(name_change):
    	for name in name_change:
    		print(name)  #这个开始打印
    		
    make_great(name_list,name_change)
    show_magicians(name_change)
    
    # 8-11 不变的魔术师 : 修改你为完成练习8-10而编写的程序, 在调用函数make_great() 时, 向它传递魔术师列表的副本。 
    # 由于不想修改原始列表, 请返回修改后的列表, 并将其存储到另一个列表中。 分别使用这两个列表来调用show_magicians() , 
    # 确认一个列表包含的是原来的魔术师名字, 而另一个列表包含的是添加了字样“the Great”的魔术师名字。
    
    name_list = ['mag1','mag2','mag3']
    name_change = []
    def make_great(name_list,name_change):
    	while name_list:
    		cur = name_list.pop()
    		cur = 'great' + cur
    		name_change.append(cur)#上面是对name——list和name——change的转移
    	
    def show_magicians(name_change):
    	for name in name_change:
    		print(name)  #这个开始打印
    		
    make_great(name_list[:],name_change)
    show_magicians(name_change)
    show_magicians(name_list)
    

    image-20210122125623388

    8.5 传递任意数量的实参

    image-20210122125951952

    形参名*cai中的星号让python创建一个名为cai的空元组,并将收到的所有值都封装到这个元组中。输出证明:python能够处理使用一个值调用函数的情形,也能处理三个值来调用的情形。

    8.5.1 结合使用位置实参和任意数量实参

    如果要让函数接受不同类型的实参,必须在函数定义中将接纳任意数量实参的形参放在最后。python先匹配位置实参和关键字实参,再将余下的实参都收集到最后的一个形参中。

    8.5.2 使用任意数量的关键字实参

    有时候,需要接受任意数量的实参,但不知道传递给函数的是什么样的信息。我们可以用函数编写成能够接受任意数量的键-值对---调用语句提供了多少就接受多少。

    image-20210122132545171

    image-20210122132556745

    形参**user是把除了对first,last之外的形参都放里面封装,并且该代码是遍历字典的中的键-值对,并将每个键-值对都加入字典profile中。最后字典返回给函数行调用。

    # 8-12 三明治 : 编写一个函数, 它接受顾客要在三明治中添加的一系列食材。 这个函数只有一个形参(它收集函数调用中提供的所有食材) , 
    # 并打印一条消息, 对顾客点的三明治进行概述。 调用这个函数三次, 每次都提供不同数量的实参。
    
    def sand_make(*ingredients):
    	print( '添加的食材有:')
    	for i in ingredients:
    		print('--' + i)
    	
    sand_make('1','2','3','4')
    sand_make('0')
    sand_make('1','2')
    

    image-20210122133017697

    任意数量的实参。。

    # 8-13 用户简介 : 复制前面的程序user_profile.py, 在其中调用build_profile() 来创建有关你的简介; 
    # 调用这个函数时, 指定你的名和姓, 以及三个描述你的键-值对。
    
    def profile(name,location,**user):
        profile={}
        profile['name']=name
        profile['location']=location
        for key,value in user.items():
            profile[key]=value
        return profile
    my=profile('mayun','aliba',company='zhejiang',xueli='bigger')
    print(my) 
    mht=profile('mahuateng','tencent',company='shenzhen',xueli='bigger')
    print(mht)
    

    image-20210122133606053

    使用的是任意数量的关键字实参。

    8.6 将函数存储在模块中

    函数的优点之一:他们可将代码块与主程序分离。通过给函数指定描述性名称,可让主程序更容易理解的多。

    还可以,将函数存储在被称为模块的独立文件中,再将模块导入到主程序中。

    import语句允许在当前运行的程序文件中使用模块中的代码。

    8.6.1 导入整个模块

    首先需要创建模块。模块的拓展名为.py,包含要导入到程序的代码。

    image-20210122140437793

    image-20210122140530082

    image-20210122142207348

    我的notepad++我不会导,这一节就过了,后期用pycharm再补过来

    6ACB06B229233066A42BCC353AF42DC3

    8.6.2 导入特定函数

    from model import fuction

    如果有多个功能,在后面用逗号分开添加。

    jiafa.py
    
    def   jia(a,b):
    
    ​	print(a+b)
    

    不使用导入特定函数,就得在调用中输入

    import jiafa

    jiafa.jia(1,3)

    如果使用了,就会有

    from jiafa import jia

    jia(1,2)

    由于我们在import语句中显示的导入了函数jia,因此调用它只要指定其名称就行。

    8.6.3 使用as给函数指定别名

    如果要导入的函数名称可能与程序中的现有的名称冲突,或者函数名称太长,可指定简短而独一无二的别名--函数的宁一个名称,相当于外号吧。。

    接上面的jiafa.py的例子

    from jiafa import jia as jiajia

    jiajia(1,2)

    8.6.4 使用as给模块指定别名

    还可以给模块指定别名。。。

    接上面的jiafa.py例子

    import jiafa as j

    j.jia(1,2)

    8.6.5 导入模块中的所有函数

    使用骂人号*可以让python导入模块的所有函数。

    import jiafa import *

    jia(1,2)

    由于导入了每个函数,可通过名称来调用每个函数,而无须使用句号表示法

    8.7 函数编写指南

    给形参指定默认值时,等号两边不要有空格(我所有的从来不加空格)

    对于函数调用中的关键字实参,也应遵循这种约定

    所有的import语句都应放在文件开头

    别人都在不停的努力,自己又怎么会停
  • 相关阅读:
    javascript规范
    freemarker规范
    java代码质量
    使用ESP8266制作一个微型气象站
    热风枪焊接表面贴装元件的工具和技巧
    MCUXpresso IDE:导入Kinetis Design Studio工程
    基于LPCXpresso54608开发板创建Embedded Wizard UI应用程序
    STM32 LoRaWAN探索板B-L072Z-LRWAN1入门指南
    LPCXpresso54608开发板中文用户手册
    STM32 LoRaWAN探索板B-L072Z-LRWAN1中文用户手册
  • 原文地址:https://www.cnblogs.com/chenyouxiu/p/14313224.html
Copyright © 2011-2022 走看看