王亟亟的Python学习之路(五)-dictionary,set,函数,函数参数

来源:互联网 时间:1970-01-01

转载请注明出处王亟亟的大牛之路

上一篇说的是循环,条件,Range,list和tuple,今天将从函数(方法)开始进一步的学习

-dictionary
-set
-函数
-函数参数


dictionary

键-值(key-value)存储,具有极快的查找速度。为什么反复提起查询速度,因为如果你一个用list只是为了获取里面X元素内容的话性能是相对比较查的,极力推荐“字典”,字典也在第三片文章中有列出,但是这里还是再丰富下他的一些常用方法。

如何获检索dic内的值

dic={'wjj':185,'wmm':175}print('第6行检索dictionary',dic['wjj'])结果:第6行检索dictionary 185

判断某个key是否存在于字典中

print('第8行,判断某个key是否在字典里','wdd' in dic)结果:第8行,判断某个key是否在字典里 False(存在为True,不存在为False)

也可以使用get的方法,并且可以指定返回值

print('第10行,如果没get到就返回自己赋予的值',dic.get('wj1j',3))结果:第10行,如果没get到就返回自己赋予的值 3print('第11行,如果没get到就返回None',dic.get('wj1j'))结果:第11行,如果没get到就返回None None

如何添加某个键值对?

dic.setdefault('wgg',102)结果:{'wjj': 185, 'wmm': 175, 'wgg': 102}

如何移除某个键值对?

dic.pop('wmm')print('第16行移除wmm后的效果',dic)结果:第16行移除wmm后的效果 {'wjj': 185, 'wgg': 102}

和list比较,dict有以下几个特点:

查找和插入的速度极快,不会随着key的增加而增加;
需要占用大量的内存,内存浪费多。

而list相反:

查找和插入的时间随着元素的增加而增加;
占用空间小,浪费内存很少。


set

set和dict类似,也是一组key的集合,但不存储value。由于key不能重复,所以,在set中,没有重复的key,类似于list和dict的结合体。

如何创建set?
再次说明,set会自动去重

sets=set([1,1,1,3,6,3])print('第20行 创建set,重复部分会被去除',sets)结果:第20行 创建set,重复部分会被去除 {1, 3, 6}

如何向set里添加元素?

再次说明:set是无序的

sets.add('12')运行第一次结果:第23行 {1, 3, 6, '12'}运行多次结果:第23行 {1, 3, '12', 6}

如何删除某一个元素?
set的remove删除的是以某个键为参数,而非下标

sets.remove(1)print('第26行',sets)结果:第26行 {3, '12', 6}

函数

什么是函数?

“函数”是从英文function翻译过来的,其实,function在英文中的意思即是“函数”,也是“功能”。从本质意义上来说,函数就是用来完成一定功能的。这样对函数的概念就很好理解了,所谓函数名就是给该功能起个名字,如果该功能是用来实现数学运算的,就是数学函数。

按照OOP的理论通俗的说,万物皆对象,对象有他的属性和方法。
如,人:身高,体重,长相 等等等都是他的属性。穿增高鞋,使他变高了,这个行为就是他的方法。

Python有许多大妞们已经写好的方法,这里贴一下,以后肯定用的到:https://docs.python.org/3/library/functions.html#all

其实我们常用的 print()也是Python给我们写好的方法,不是么?

列举下SDK内写好的函数:

print('第29行 打印最大值',max(1,21,2,3))print('第30行 绝对值',abs(-10),abs(100))print('第31行 遍历是否都为真',all([True,True,True]),all([True,False,True]),all([3>2,True,True]))print('第31行 遍历部分是否为真',any([True,True,True]),any([True,False,True]),any([3>2,True,True]))结果:第29行 打印最大值 21第30行 绝对值 10 100第31行 遍历是否都为真 True False True第31行 遍历部分是否为真 True True True

数据类型转换

数据类型转换是我们碰到常有的事,例如:用户input一个价格为’123’字符串进来,我们需要把他转成整型或者浮点型才可以进行操作。

如何在Python中判断食神恶魔数据类型的?

print(isinstance(12,str))结果:False

简单的数据类型的转换

类型转换,bool 除了0 别的值返回都是 True

print('第35 打印字符串转数字',int('123'))print('第36 各种类型转换',str(100)+'你好',float('10.34'),int(17.3124), bool(1))结果:第35 打印字符串转数字 123第36 各种类型转换 100你好 10.34 17 True

函数名其实就是指向一个函数对象的引用,完全可以把函数名赋给一个变量,相当于给这个函数起了一个“别名”:

# 变量a指向abs函数a = max#所以也可以通过a调用abs函数print('第41行 函数赋值',a(-1,2,3))结果:第41行 函数赋值 3

在Python中,定义一个函数要使用def语句,依次写出函数名、括号、括号中的参数和冒号:,然后,在缩进块中编写函数体,函数的返回值用return语句返回。

一般格式:

def 函数名(参数列表): 函数体

事例:

def strToInt(str): intValue=int(str) return intValue#调用函数 print('第47行 打印有返回值的自定义函数',strToInt('10086'))结果:第47行 打印有返回值的自定义函数 10086

如果我的函数没有返回值那怎么办?那没有返回值的函数实质返回了什么?

如果没有return语句,函数执行完毕后也会返回结果,只是结果为None。

intVBal=1def intToBool(intVBal): print('第52行转数据类型',bool(intVBal))intToBool(intVBal)print('第55行 显示返回值',intToBool(intVBal))结果:#因为又调用了一次函数,所以多打印了一行第52行转数据类型 True第52行转数据类型 True第55行 显示返回值 None

抛异常:

调用函数时,如果参数个数不对,Python解释器会自动检查出来,并抛出TypeError。
但是如果参数类型不对,Python解释器就无法帮我们检查。

但是我们可以先检测出问题,然后手动的抛出异常

def wjj(x): if not isinstance(x, (int, float)): raise TypeError('bad type') if x >= 0: return x else: return -x结果:> wjj('A')Traceback (most recent call last): File "<stdin>", line 1, in <module> File "<stdin>", line 3, in wjjTypeError: bad type

Python的函数可以返回多个值吗?

可以,看例子

def reMoreVal(x,y): return x,yprint('第70行 返回多个值',reMoreVal(1,'a'))结果:第70行 返回多个值 (1, 'a')

Python的函数返回多值其实就是返回一个tuple。


匿名函数

addAll=lambda arg1,arg2,arg3:arg1+arg2+arg3
print(‘第93行打印他们的合’,addAll(2,3,4))


函数参数

函数参数其实也就是我们传入函数的值,有些函数没有参数,有些函数有一个参数或者多个参数,甚至可以传入None

下面例子就是刚才的2个返回值的函数,他也传入了两个值

def reMoreVal(x,y): return x,y

那么问题来了,如果我一个方法有好多个参数,但是有些参数是可选项怎么办?

可以使用,默认参数

def printInfo( name, age = 35 ): print("Name: ", name) print("Age ", age) return#调用printinfo函数printInfo( age=50, name="miki" )printInfo( name="miki" )结果:Name: mikiAge 50Name: mikiAge 35

默认参数降低了函数调用的难度,而一旦需要更复杂的调用时,又可以传递更多的参数来实现。无论是简单调用还是复杂调用,函数只需要定义一个。
使用默认参数必须以name=”miki” 一般的键值对的形式传入

如果,我传入的参数的数值,我自己都不知道怎么办,如传入一个list,tuple等?
可以用可变参数

#不定长参数def printMore(value,*more): print(value) for val in more: print(val,end=' ') print() returnprintMore('aaa',1,2,3)结果:aaa1 2 3 

*more就是代表着我们那个不确定值的参数
传入a=[1,2,3]和1,2,3为同一效果

除了传入可变参数之外还可以传入关键字参数,关键字参数允许你传入0个或任意个含参数名的参数,这些关键字参数在函数内部自动组装为一个dict

def people(name, age, **kw): print('name:', name, 'age:', age, 'other:', kw)#调用people('Bob', 35, city='ShangHai')结果:name: Bob age: 35 other: {'city': 'ShangHai'}

如果要对这些关键字参数进行限制,就要用命名关键字参数

如果要限制关键字参数的名字,就可以用命名关键字参数,例如,只接收city和job作为关键字参数。这种方式定义的函数如下:

*后面的参数被视为命名关键字参数。

def people(name, age, *, city, job,gender): print(name, age, city, job,gender)

命名关键字参数必须传入参数名,这和位置参数不同。如果没有传入参数名,调用将报错

但是如果命名关键字参数有默认值,调用时,可不传入参数
如:

def people(name, age, *, city='Beijing', job): print(name, age, city, job)people('wjj', 24, job='teacher')wjj 24 Beijing teacher

Python的函数具有非常灵活的参数形态,既可以实现简单的调用,又可以传入非常复杂的参数。

默认参数一定要用不可变对象,如果是可变对象,程序运行时会有逻辑错误!

要注意定义可变参数和关键字参数的语法:

*args是可变参数,args接收的是一个tuple;

**kw是关键字参数,kw接收的是一个dict。

使用*args和**kw是Python的习惯写法,当然也可以用其他参数名,但最好使用习惯用法。

命名的关键字参数是为了限制调用者可以传入的参数名,同时可以提供默认值。

定义命名的关键字参数不要忘了写分隔符*,否则定义的将是位置参数。

跟以前一样,今天的示例代码已经传到git,运行如下:

源码地址:https://github.com/ddwhan0123/PythonExample/blob/master/%E7%A4%BA%E4%BE%8B/l3demo.py

麻烦点个赞,谢谢



相关阅读:
Top