程序改错。实现输入单词,按照字典排序输出。求助大佬!

还是对于python字典理解不透彻试图通过sort来给python的key指定顺序,几经试验仍然得不到想要的效果,后来一想python的字典不是本来就无序的么? 老王python的文章里这样写:(链接/post//art/006.htm Python编程语言昰一款比较容易学习的计算机通用型语言对于初学者来说,首先需要掌握的就是其中的一些基础应用比如今天我们为大家介绍的Python字典嘚相关操作,就是我们在学习过程中需要熟练掌握的技巧...

①编写一个程序从键盘接收一個字符串,然后按照字符顺序从小到大进行排序并删除重复的字符

【问题描述】编写一个程序,从键盘接收一个字符串然后按照字符順序从小到大进行排序,并删除重复的字符
【输入形式】用户在第一行输入一个字符串。
【输出形式】程序按照字符(ASCII)顺序从小到大排序芓符串并删除重复的字符进行输出。
【样例说明】用户输入字符串badacgegfacb程序对其进行按从小到大(ASCII)顺序排序,并删除重复的字符最后输出為abcdefg

【问题描述】两个集合的差集定义如下:
集合A、B的差集,由所有属于A但不属于B的元素构成
输入两个集合A、B,每个集合中元素都是自然數求集合A、B的差集。
从标准输入接收集合中的自然数元素以空格分隔。-1表示输入结束
其中,每个集合都不输入重复的元素
输出差運算后集合中的元素,以空格分隔输出元素的顺序与原有集合A输入的顺序一致。
如果A、B的差集为空集则不输出任何数值。
【样例说明】从标准输入接收集合中的自然数元素输出集合A、B的差集。

③对分行输入的若干字符串按字典序(由小到大)进行排序并输出

【问题描述】对分行输入的若干字符串按字典序(由小到大)进行排序并输出。
【输入形式】控制台输入多行字符串各个字符串可能含有空格,以#结束
【输出形式】输出按字典序(由小到大)进行排序后的字符串

if-else语句可以产生两个分支可根据條件表达式的判断结果选择执行哪一个分支。

print('输入的用户名和密码有误请重新输入')

input函数接受一个标准输入数据,返回为 string 类型

处理多种凊况时,可以使用if-elif-else语句

条件1为true,执行代码块1

条件1为false条件2为true,执行代码块2

以上所有条件都为false执行代码

条件1为true,执行代码1

? 条件2为true执荇代码2

迭代:是指通过重复执行的代码处理相似的数据集的过程,并且本次迭代的处理数据要依赖上一次的结果继续往下做上一次产生嘚结果为下一次产生结果的初始状态,如果中途有任何停顿都不能算是迭代。

可迭代对象:列表元组,字典字符串,range函数

for循环的嵌套使用:


 
 

while循环是一个条件循环语句,当条件满足时重复执行代码块直到条件不满足为止。

使用while循环求10!!代表连乘。

使用while循环嵌套咑印三角形

break语句用于跳出离它最近一级的循环通常与if语句结合使用,放在if语句代码块中

continue语句用于跳出当前循环,继续执行下一次循环


  

列表是python中最灵活的有序序列,它可以存储任意类型的元素开发人员可以对列表中的元素进行添加,删除修改等操作。

使用中括号创建列表时只需要在’[]'中使用逗号分隔每个元素即可。

使用list()函数创建列表时需要给该函数传入一个可迭代类型的数据。

isinstance()函数可用于判断┅个对象是否为可迭代对象


使用索引方式访问列表元素



  

案例需求,假设某列表中存储的是会员的名字可以通过循环遍历该列表,依次姠会员推送商品优惠信息


 

sort()方法能够对列表元素排序,该方法的语法格式如下:


sorted方法得到一个新的列表不会修改原列表的数据

reverse方法,是將列表中的数据逆置列表[::-1]会的到一个新的列表。列表.reverse()直接修改原列表不会创建一个新列表。

append()方法用于在列表末尾添加新的元素

extend()方法鼡于在列表末尾一次性添加另一个列表中的所有元素,即使用新列表扩展原来的列表

insert()方法用于将元素插入列表的指定位置。

del语句用于删除列表中指定位置的元素

remove()方法用于移除列表中的某个元素,若列表中有多个匹配的元素只会移除匹配到的第一个元素。

pop()方法用于移除列表中的某个元素如果不指定具体元素,那么移除列表中的最后一个元素

修改列表中的元素就是通过索引获取元素并对该元素重新赋徝。

嵌套列表的创建与元素的访问

列表可以存储任何元素当然也可以存储列表,若列表中存储的元素也是列表则称为嵌套列表。


使用圓括号’()'创建元组并将元组中的元素用逗号进行分隔。

当使用圆括号创建元组时如果元组中只包含一个元素,那么需要在该元素的后媔添加逗号从而保证python解释器能够识别其为元组类型。

使用tuple()函数创建元组时如果不传入任何数据,就会创建一个空元组;如果需要创建包含元素的元组就必须传入可迭代类型的据。


元组可以使用索引访问元组中的元素

元组还可以使用切片来访问元组中的元素。

元组中嘚元素是不允许修改的除非在元组中包含可变类型的数据。

元组所谓的“不变”意为元组每个元素的指向永远不变


使用花括号“{}”创建字典时,字典的键(key)和值(value)使用冒号连接每个键值对之间使用逗号分隔。

使用dict()函数创建字典时键和值使用“=”进行连接。

字典中的键是唯一的当创建字典时出现重复的键——若使用dict()函数创建字典,提示语法错误;若使用花括号创建字典键对应的值会被覆盖。


因为字典中嘚键是唯一的所以可以通过键获取对应的值。

为了避免引起keyerror异常当访问字典元素时可以先使用in与not in检测某个键是否存在。


  

字典可以通过update()方法或指定的键添加元素


pop()方法可以根据指定的键删除字典中的指定元素,若删除成功则返回目标元素的值

popitem()方法可以随机删除字典中的え素,若删除成功则返回目标元素

clear()方法用于清空字典中的元素。


  

使用items()方法可以查看字典的所有元素

使用keys()方法可以查看字典中所有的键。

使用values()方法可以查看字典的所有值

三种方法都支持迭代操作。

 

集合分为可变集合与不可变集合

可变集合:由set()函数创建,集合中的元素鈳以动态地增加或删除

不可变集合:由frozenset()函数创建,集合中的元素不可改变

可以直接使用花括号创建可变集合,花括号中的多个元素以逗號分隔

集合中的数据必须是不可变类型,并且数据是没有重复的


集合元素的添加,删除和清空

可变集合的add()或update()方法都可以实现向集合中添加元素其中add()方法只能添加一个元素,而update()方法可以添加多个元素

remove()方法用于删除可变集合中的指定元素。

discard()方法可以删除指定的元素但若指定的元素不存在,该方法不执行任何操作

clear()方法可以情空可变集合中的元素。


联合操作是将集合seta与集合setb合并成一个新的集合联合使鼡“|”符号实现。

交集操作是将集合seta与集合setb中相同的元素提取为一个新的集合交集使用“&”符号实现。

差补操作是将只属于集合seta或者只屬于集合setb中的元素作为一个新的集合差补使用“-”符号实现。

对称差分操作是将只属于集合seta与只属于集合setb中的元素组成一个新的集合對称差分使用^符号实现。

函数指被封装起来的实现某种功能的一段代码。python安装包标准库中自带的函数统称为内置函数,用户自己编写嘚函数称为自定义函数不管是哪种函数,其定义和调用方式都是一样的

若函数的参数列表为空,这个函数称为无参函数

函数定义之時可以设置参数列表,以实现更灵活的功能


 
 

定义好的函数直到被程序调用时才会被执行。

调用带有参数的函数时需要传入参数传入的參数称为实际参数,实际参数是程序执行过程中真正会使用的参数


 
 

函数的参数传递是指将实际参数传递给形式参数的过程。根据不同的傳递形式函数的参数可分:

(位置参数,默认值参数关键字参数,不定长参数)

调用函数时解释器会将函数的实际参数按照位置顺序依佽传递给形式参数。


关键字参数通过“形式参数=实际参数”的格式将实际参数与形式参数相关联根据形参的名称进行参数传递。

定义函數时可以指定形式参数的默认值调用函数时,可分为以下两种情况:

未给默认参数传值:使用参数的默认值

给默认参数传值:使用实际参数嘚值


 

若要传入函数中的参数的个数不确定可以使用不定长参数。不定长参数也称可变参数此种参数接收参数的数量可以任意改变。

不萣长参数 *args用于接收不定数量的位置参数调用函数时传入的所有参数被 *args接受后以元组形式保存。

** kwargs用于接受不定数量的关键字参数调用函數时传入的所有参数被 ** kwargs接收后以字典形式保存。

变量的作用域是指变量的作用范围根据作用范围,python种的变量分为局部变量与全局变量

局部变量是在函数内定义的变量,只在定义它的函数内生效

全局变量是在函数外定义的变量,它在程序中任何位置都可以被访问

函数Φ只能访问全局变量,但不能修改全局变量

若要在函数内部修改全局变量的值,需先在函数内使用关键字”global“进行声明


 

匿名函数是无需函数名标识的函数,它的函数体只能是单个表达式python中使用关键字lambda定义匿名函数。

为了方便使用匿名函数应使用变量记录这个函数。


遞归是一个函数过程在定义中直接调用自身的一种方法它通常把一个大型的复杂问题层层转化为一个与原问题相似,但规模较小的问题進行求解

如果一个函数中调用了函数本身,这个函数就是递归函数

递归函数只需少量代码就可描述出解题过程所需要的多次重复计算,大大地减少了程序地代码量

函数递归调用时,需要确定两点:一是递归公式二是边界条件。

递归公式:是递归求解过程中的归纳项用于处理原问题以及与原问题规律相同的子问题。

边界条件:边界条件即终止条件用于终止递归。

abs()函数用于计算绝对值其参数必须昰数字类型。如果参数是一个复数那么abs()函数返回的绝对值是此复数与它的共轭复数乘积的平方根。

ord()函数用于返回字符在unicode编码表中对应的碼值其参数是一个字符。

chr()函数和ord()函数功能相反其参数是一个整数。

面向过程编程的基本思想是:分析解决问题的步骤使用函数实现步骤相应的功能,按照步骤的先后顺序依次调用函数

面向过程只考虑如何解决当前问题,它着眼于问题本身

面向对象编程的基本思想昰:首先会从问题之中提炼出问题涉及的角色,将不同角色各自的特征和关系进行封装以角色为主体,通过描述角色的行为去描述解决問题的过程

面向对象编程的着眼之处在于角色以及角色之间的联系。

角色之间相互独立但相互协作,流程不再由单一的功能函数实现而是通过调用与角色相关的方法来完成。

对象是构成世界的一个独立单位它由数据(描述事物的属性)和作用于数据的条件(体现事务的行為)构成一个独立整体。

类是具有相同属性和行为的一组对象的集合它提供一个抽象的描述,其内部包括属性和方法两个主要部分它就潒一个模具,可以用它铸造一个个具体的铸件

抽象是抽取特定实例的共同特征,形成概念的过程

封装是面向对象的核心思想,将对象嘚属性和行为封装起来不需要让外界指定具体实现细节,这就是封装思想

继承描述的是类与类之间的关系,通过继承新生类可以在無需赘写原有类的情况下,对原有类的功能进行扩展

多态指同一个属性或行为在父类及其各派生类中具有不同的语义。

类是对多个对象囲同特征的抽象描述它是对象的模板。

对象用于描述现实中的个体它是类的实例。

类中可以定义数据成员和成员函数数据成员用于描述对象特征,成员函数用于描述对象行为其中数据成员也被称为属性,成员函数也被称为方法


 
 
 

若想在程序中真正地使用对象,需掌握访问对象成员地方式对象成员分为属性和方法,他们的访问格式分别如下:

对象名.属性 对象名.方法()


 
 

类中定义的属性和方法默认为共有屬性和共有方法该类的对象可以任意访问类的共有成员。

可以通过类成员名之前添加双下划线_ _来限制成员的访问权限

_ init _()方法按照参数的囿无(self除外,因为self是默认参数)可分为有参构造方法和无参构造方法

无参构造方法:可以为属性设置初始值,此时使用该方法创建的所有对潒都具有相同的初始值

有参构造方法:可以使用参数为属性设置初始值,此时使用该方法创建的所有对象都具有不同的初始值


 
 

对象属性和类属性的区别:对象属性只能使用对象进行访问,不能使用类进行访问类属性可以使用类和对象进行访问。

getrefcount()函数是sys模块中用于统计對象引用数量的函数其返回结果通常比预期的结果大1。

当一个对象的引用计数器数值为0时就会调用_ del _()方法,这个方法就是类的析构方法


 

类方法可以被类名或对象名调用,其语法格式如下:

在实例方法中无法修改类属性的值但在类方法中可以修改类属性的值。

单继承指嘚是子类只继承一个父类其语法格式如下:

print('成年使用肺兼皮肤呼吸')

多继承指的是一个子类继承多个父类,其语法格式如下:


子类可以继承父类的属性和方法若父类的方法不能满足子类的要求,子类可以重写父类的方法以实现理想的功能。

print('猫科动物的特长是爬树')

如果子類重复写了父类的方法但仍希望调用父类中的方法,那么可以使用super()函数实现

print('猫科动物的特长是爬树')

多态:对象调用同一个方法会出现不哃的表现形式或者不同的结果,那么该操作便是多态

多态的使用场景:强掉的是对象想要完成同一个功能,此时便可以想到多态

注意:使用多态的时候必须提供一个统一的调用函数或者方法,使用该函数或者方法完成多态的操作

print('兔子通过蹦蹦跳跳进行移动') print('蜗牛通过缓慢爬行进行移动') def move(obj):obj表示形参,是用来接受都能够进行移动的对象比如兔子和蜗牛对象。利用多态的操作完成动物移动的功能

在python程序中,烸个.py文件都可以视为一个模块通过在当前.py文件中导入其它.py文件,可以使用被导入文件中定义的内容

python中的模块分为三类,分别是内置模塊第三方模块和自定义模块。

内置模块:python的官方模块可直接导入程序供开发人员使用。

第三方模块:由非官方制作发布的供给大众使用的python模块,在使用之前需要开发人员先自行安装

自定义模块:开发人员在程序编写的过程中自行编写的存放功能性代码的.py文件。

使用import導入模块的语法格式如下:

模块导入之后便可以通过"."使用模块中的函数或类

模块名.函数名()/类名

如果开发过程中需要导入一些名称较长的模块,可以使用AS为这些模块起别名语法格式如下:

使用from…import…方式导入模块之后,无需添加前缀可以像使用当前程序中的内容一样使用模塊中的内容,此种方式的语法格式如下:

from…import…也支持一次导入多个函数类,变量等函数与函数之间使用逗号分隔。

利用通配符“*”可鉯使用from…import…导入模块中的全部内容

from…import…也支持为模块或模块中的函数起别名。

sys模块中提供了一系列与python解释器交互的函数和变量用于操控python的运行时环境。

os模块中提供了访问操作系统服务的功能

random模块为随机数模块,该模块中定义了多个可产生各种随机数的函数

time模块中提供了一系列处理时间的函数。


_ all _属性实际上是一个元组该元组中包含的元素决定了在使用from…import * 语句导入模块内容时通配符*所包含的内容。

如果 _ all _中只包含模块的部分内容那么from…import * 语句只会将 _ all _中包含的部分内容导入程序。

为了避免项目运行时执行这些测试代码python中设置了_ name _属性。

_ name _属性通常与if条件语句一起使用若当前模块是启动模块,则其 _ name _的值为” _ main _";若该模块被其它程序导入则 _ name _的值为文件名。

python中的包是一个包含_ init _.py文件嘚目录该目录下还包含一些模块以及子包。

包中的_ init _.py文件可以为空但必须存在,否则包将退化为一个普通目录

_ init _.py文件有两个作用,第一個作用是标识当前目录是一个python的包;第二个作用是模糊导入如果 _ int _文件没有声明 _ all _ 属性,那么使用from … import * 导入的内容为空


使用import导入包中的模块時,需要在模块名的前面加上包名格式为“包名.模块名”。若要使用已导入模块中的函数时需要通过“包名.模块.函数”实现。

通过from…import…导入包中模块包含的内容若需要使用导入模块中的函数,需要通过“模块.函数”实现

计算机中的文件能够持久保存程序运行时产生嘚数据。

open()函数用于打开文件该函数调用成功会返回一个文件对象。

file:表示待打开文件的文件名

encoding:表示文件的编码格式。

mode:表示文件的打开模式

close()方法用于关闭文件,该方法没有参数直接调用即可。

程序执行完毕后系统会自动关闭由该程序打开的文件,但计算机中可打开的攵件数量是有限的每打开一个文件,可打开文件数量就减一;打开的文件占用系统自愿若打开的文件过多,会降低系统性能因此,編写程序时应使用close()方法主动关闭不在使用的文件

read()方法可以从指定文件中读取指定数据,其语法格式如下:

参数size表示设置的读取数据的字节數若该参数缺省,则一次读取指定文件中的所有数据

readline()方法可以从指定文件中读取一行数据,其语法格式如下:

每执行一次readline()方法便会读取攵件中的一行数据

readlinues()方法可以一次读取文件中的所有数据,其语法格式如下:

readlinues()方法在读取数据后会返回一个列表该列表中的每个元素对應着文件中的每一行数据。

read()(参数缺省时)和readlines()方法都可一次读取文件中的全部数据但这两种操作都不够安全。因为计算机的内存是有限的若文件较大,read()和readlines()的一次读取便会耗尽系统内存为了保证读取安全,通常多次调用read()方法每次读取size字节的数据。


通过write()方法向文件中写入数據其语法格式如下。

参数str表示要写入的字符串若字符串写入成功,write()方法返回本次写入文件的长度

writelines()方法用于向文件中写入字符串序列,其语法格式如下:


在文件的一次打开与关闭之间进行的读写操作都是连续的程序总是从上次读写的位置继续向下进行读写操作。

实际仩每个文件对象都有一个称为“文件读写位置”的属性,该属性用于记录文件当前读写的位置

tell()方法用于获取当前文件读写的位置,其語法格式如下:

seek()方法用于设置当前文件读写位置其语法格式如下:

offset:表示偏移量,即读写位置需要移动的字节数;

from:用于指定文件的读写位置該参数的取值有:0,12,其中0表示在开始位置读写;1表示在当前位置读写;2表示在末尾位置读写

文件拷贝即创建文件的副本,此项操作嘚本质仍是文件的打开关闭与读写,基本逻辑如下:

1.打开文件 2.读取文件内容 3.创建新文件将数据写入到新文件中

4.关闭文件,保存数据

python提供了用于更改文件名的函数,rename(),该函数存在于os模块中其语法格式如下:

rename(原文件名,新文件名)

os模块中的mkdir()函数用于创建目录其语法格式如丅:

path:表示要创建的目录。

mode:表示目录的数字权限该参数在windows系统下可忽略。

结论mkdir不能在创建一个已存在的目录

os.path.exists():是用来判断程序中的目录或文件是否存在如果存在返回True,否则为False

使用python内置模块shutil中的rmtree()函数可以删除目录其语法格式如下:

os模块中的listdir()函数用于获取文件夹下文件或文件名嘚列表,该列表以字母顺序排序其语法格式如下:

文件相对路径指这个文件夹所在的路径与其它文件(或文件夹)的路径关系,绝对路径指盤符开始到当前位置的路径

isabs()函数可以判断目标路径是否为绝对路径,若为绝对路径返回True否则返回False。

当目标路径为相对路径时使用abspath()函數可将当前路径规范化为绝对路径。

os.path模块中的join()函数用于拼接路径其语法格式如下:

如果最后一个路径为空,则生成的路径将以一个""结尾

判断一个数是不是素数。

python是以缩进来标记代码块的代码块一定要有缩进,没有缩进的不是代码块另外,同一个代码块的缩进量要相哃缩进量不同的不属于同一个代码块。不同的代码块会执行出不想要的结果

Python 中使用了分号作为语句分隔符,但是不用分号作为终止符 而是用了换行作为终止符。若在一句完整的语句末尾加了分号然后换行,那么 IDE 一般会提示“Trailing semicolon in the statement”提示着这个“尾随分号”是多余的。

Python 鈈用分号作为终止符大概有如下的原因:

  1. 它把缩进和换行当成文法的有效部分,可以表达出完整的语义不会导致编译时的歧义。这是朂主要的原因是跟“分号党”的根本区别
  2. 不用分号与花括号,但是使用缩进和冒号这是一脉相承的思路,总体上形成了更高的可读性、简洁性和标准化这体现了局部语法与整体规则的关系,1 + 1 > 2
  3. 可以少写字符也避免了在某些键盘上要敲“shift”键的麻烦
  4. 分号主要是给机器看嘚,但 Python 更注重于人性化早期硬件有所限制,加分号可以提升解析/编译的速度但如今障碍已除,某些分号党语言只是在延续 B/C 语言的老传統
  5. 对于需要换行的语句Python 中使用反斜杠(\)来连接,可以理解成它把换行给转义了能够解决一句多行的问题

从100个数中随机生成10个数


NameError:找不箌指定名称的变量时引发

IndexError:当使用超出列表范围的索引时引发

KeyError:当使用映射不存在的键时引发

TypeError:当试图在使用a类型的场合使用b类型时引发

敲“shift”鍵的麻烦
4. 分号主要是给机器看的,但 Python 更注重于人性化早期硬件有所限制,加分号可以提升解析/编译的速度但如今障碍已除,某些分号黨语言只是在延续 B/C 语言的老传统
5. 对于需要换行的语句Python 中使用反斜杠(\)来连接,可以理解成它把换行给转义了能够解决一句多行的问題


从100个数中随机生成10个数


NameError:找不到指定名称的变量时引发

IndexError:当使用超出列表范围的索引时引发

KeyError:当使用映射不存在的键时引发

TypeError:当试图在使用a类型嘚场合使用b类型时引发

我要回帖

 

随机推荐