转载请注明出处王亟亟的大牛之路
上一篇说的是循环,条件,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,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=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,运行如下:
源码地址:https://github.com/ddwhan0123/PythonExample/blob/master/%E7%A4%BA%E4%BE%8B/l3demo.py
麻烦点个赞,谢谢