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

时间:2022-10-13 00:23:48

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

上一篇说的是循环,条件,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到就返回自己赋予的值 3

print('第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,23))

结果:

41行 函数赋值 3

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

一般格式:

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

事例:

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

结果:
47行 打印有返回值的自定义函数 10086

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

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

intVBal=1
def 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 wjj
TypeError: bad type

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

可以,看例子

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

print('第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: miki
Age 50
Name: miki
Age 35

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

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

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

结果:

aaa
1 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,运行如下:
王亟亟的Python学习之路(五)-dictionary,set,函数,函数参数

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

麻烦点个赞,谢谢
王亟亟的Python学习之路(五)-dictionary,set,函数,函数参数