Day4-python基础之函数
本次学习内容:
- 字典查询快的原因
- 字符编码
- 函数定义
- 局部变量、全局变量
- 返回值
- 嵌套函数
- 递归(二分查找)
- 三元运算
- map
- lamba
- 函数式编程
- 高阶函数
- 内置函数
字典查询快的原因:
字典占用内存比列表多,但是查询速度比列表快的多
为什么会查询速度会快呢?因为他是hash类型的,那什么是hash呢?
哈希算法将任意长度的二进制值映射为较短的固定长度的二进制值,这个小的二进制值称为哈希值。哈希值是一段数据唯一且极其紧凑的数值表示形式。如果散列一段明文而且哪怕只更改该段落的一个字母,随后的哈希都将产生不同的值。要找到散列为同一个值的两个不同的输入,在计算上是不可能的,所以数据的哈希值可以检验数据的完整性。一般用于快速查找和加密算法
dict会把所有的key变成hash 表,然后将这个表进行排序,这样,你通过data[key]去查data字典中一个key的时候,python会先把这个key hash成一个数字,然后拿这个数字到hash表中看没有这个数字, 如果有,拿到这个key在hash表中的索引,拿到这个索引去与此key对应的value的内存地址那取值就可以了。
那为什么会快呢?通过数字去hash表中查看数字时,采用某种算法,maybe是二分法,查询的次数很少。
key -->hash值-->类似二分查找,找到hash值索引-->value对应的内存地址
字符编码
先说python2
- py2里默认编码是ascii
- 文件开头那个编码声明是告诉解释这个代码的程序 以什么编码格式 把这段代码读入到内存,因为到了内存里,这段代码其实是以bytes二进制格式存的,不过即使是2进制流,也可以按不同的编码格式转成2进制流,你懂么?
- 如果在文件头声明了#_*_coding:utf-8*_,就可以写中文了, 不声明的话,python在处理这段代码时按ascii,显然会出错, 加了这个声明后,里面的代码就全是utf-8格式了
- 在有#_*_coding:utf-8*_的情况下,你在声明变量如果写成name=u"大保健",那这个字符就是unicode格式,不加这个u,那你声明的字符串就是utf-8格式
- utf-8 to gbk怎么转,utf8先decode成unicode,再encode成gbk
再说python3
- py3里默认文件编码就是utf-8,所以可以直接写中文,也不需要文件头声明编码了,干的漂亮
- 你声明的变量默认是unicode编码,不是utf-8, 因为默认即是unicode了(不像在py2里,你想直接声明成unicode还得在变量前加个u), 此时你想转成gbk的话,直接your_str.encode("gbk")即可以
- 但py3里,你在your_str.encode("gbk")时,感觉好像还加了一个动作,就是encode的数据变成了bytes里,我操,这是怎么个情况,因为在py3里,str and bytes做了明确的区分,你可以理解为bytes就是2进制流,你会说,我看到的不是010101这样的2进制呀, 那是因为python为了让你能对数据进行操作而在内存级别又帮你做了一层封装,否则让你直接看到一堆2进制,你能看出哪个字符对应哪段2进制么?什么?自己换算,得了吧,你连超过2位数的数字加减运算都费劲,还还是省省心吧。
- 那你说,在py2里好像也有bytes呀,是的,不过py2里的bytes只是对str做了个别名,没有像py3一样给你显示的多出来一层封装,但其实其内部还是封装了的。 这么讲吧, 无论是2还是3, 从硬盘到内存,数据格式都是 010101二进制到-->b'\xe4\xbd\xa0\xe5\xa5\xbd' bytes类型-->按照指定编码转成你能看懂的文字
总结:
- utf8中一个中文占3个字节
- python2中utf8转gbk 先decode成unicode 再encode成gbk
- 只有unicode能encode、decode
编码应用比较多的场景应该是爬虫了,互联网上很多网站用的编码格式很杂,虽然整体趋向都变成utf-8,但现在还是很杂,所以爬网页时就需要你进行各种编码的转换,不过生活正在变美好,期待一个不需要转码的世界。
函数的定义
定义: 函数是指将一组语句的集合通过一个名字(函数名)封装起来,要想执行这个函数,只需调用其函数名即可
特性:
- 减少重复代码
- 使程序变的可扩展
- 使程序变得易维护
函数的定义主要有如下要点:
- def:表示函数的关键字
- 函数名:函数的名称,日后根据函数名调用函数
- 函数体:函数中进行一系列的逻辑计算,如:发送邮件、计算出 [11,22,38,888,2]中的最大数等...
- 参数:为函数体提供数据
- 返回值:当函数执行完毕后,可以给调用者返回数据。
def func(name):#func函数名,name参数
print('my name is',name)#函数体
func('hongpeng')#调用func函数
形参:变量只有在被调用时才分配内存单元,在调用结束时,即刻释放所分配的内存单元。因此,形参只在函数内部有效。函数调用结束返回主调用函数后则不能再使用该形参变量
实参:可以是常量、变量、表达式、函数等,无论实参是何种类型的量,在进行函数调用时,它们都必须有确定的值,以便把这些值传送给形参。因此应预先用赋值,输入等办法使参数获得确定值
上面的例子中name就是形参,'hongpeng'就是实参
函数的几种参数
1.普通参数
像下面例子中的name,age,job
2.默认参数
在定义函数时直接赋值,调用函数如果不指明默认就是定义函数时赋的值,指明的话就是你赋的值,定义时特别要注意默认参数在最后。
def inf(name,age,job,country='CN'):
print('the information of %s'.center(50,'-')%name)
print('name:',name)
print('age:',age)
print('job:',job)
print('country:',country)
inf('hongpeng',21,'ops')
inf('alex',31,'loser','JP')
#输出
--------------the information of hongpeng---------------
name: hongpeng
age: 21
job: ops
country: CN
--------------the information of alex---------------
name: alex
age: 31
job: loser
country: JP
3.关键参数
正常情况下,给函数传参数要按顺序,如果一个函数中参数太多或者不想按顺序就可以用关键参数,只需调用时指定参数名即可,好像没什么卵用。。。非固定参数**kwargs在传参数的时候会用到。
4.非固定参数
若你的函数在定义时不确定用户想传入多少个参数,就可以使用非固定参数
*args
def inf(name,age,job,*args):#*args会把多个传入的参数放入一个元组中
print(name,age,job,args)
inf('hongpeng',21,'ops')
inf1('hongpeng',21,'ops','CN','python')
#输出
hongpeng 21 ops ()#因为没有传值,所以args为空
hongpeng 21 ops ('CN', 'python')
**kwargs
def inf(name,age,job,**kwargs):#**kwargs把传入参数放在字典中,所以调用时参数得用关键参数的形式
print(name,age,job,kwargs)
inf('hongpeng',21,'ops')
inf('hongpeng',21,'ops',country = 'CN',lesson = 'python')
#输出
hongpeng 21 ops {}
hongpeng 21 ops {'lesson': 'python', 'country': 'CN'}
局部变量和全局变量
name = 'alex'
def inf():
name = 'hongpeng'
print('函数里面的name:',name)
inf()
print('函数外的name:',name)
函数里面的name改变并没有影响到外部的name
如果想在函数里面对全局变量改变,用global,但是一般不会在函数里面去改全局变量的值,so,忘了它吧。
name = 'alex'
def inf():
global name
name = 'hongpeng'
print('函数里面的name:',name)
inf()
print('函数外的name:',name)
#输出
函数里面的name: hongpeng
函数外的name: hongpeng
返回值
def auth():
username = input("username:").strip()
password = input("password:").strip()
#get data from db
_username = "alex"
_password = "alex3714"
if username == _username and password == _password:
print("passed authentication!")
# global login_status
# login_status = True #局部变量
# print("-->",login_status)
return True, 1,2
print("after return ....")
else:
return False def home():
if login_status == True:
print("welcome to home page")
else:
auth()
def pay():
if login_status == True:
print("welcome to pay page")
else:
auth() login_status = auth()
print(login_status) # print(login_status)
home()
pay()
name = 'ALEX'
def name():
name = 'alex'
def name2():
name = 'hongpeng'
print('3name:',name)
name2()
print('2name',name)
name()
#输出
3name: hongpeng
2name alex
递归函数
在函数内部,可以调用其他函数。如果一个函数在内部调用自身本身,这个函数就是递归函数。
def calc(n):
print(n)
if n//2> 0:
calc(n//2)
calc(10)
#输出
10
5
2
1
def calc(n):
if n//2> 0:
calc(n//2)
print(n)
calc(10)
#输出
1
2
5
10
递归特性:
1.必须有一个明确的结束条件
2.每次进入更深一层递归时,问题规模相比上次递归有所减少
3.递归效率不高,递归层次过多会导致栈溢出
递归实际应用(二分查找)
def find(dataset,find_num): if len(dataset) > 0:
mid_pos = int(len(dataset)/2)
if dataset[mid_pos] == find_num:
print('find the number',dataset[mid_pos])
elif dataset[mid_pos] > find_num:
print('going to left side')
print(dataset[mid_pos])
find(dataset[0:mid_pos],find_num)
else:
print('going to right side')
print(dataset[mid_pos+1])
find(dataset[mid_pos+1:],find_num)
else:
print("can't find the num")
data = range(0,10000,5)
find(data,88)
匿名函数+map+三元运算
#匿名函数
n = lambda x,y:x+y
print(n(4,5))
#map函数
data = map(lambda n:n**2,range(5))
for i in data:
print(i)
#三元运算
a = 4
b = 5
c = a if a >10 else b
print(c)
#函数+lambda+map+三元运算
def calc(n):
return -n
data = map(lambda x:x**2 if x>5 else calc(x),range(10))
for i in data:
print(i)
高阶函数
变量可以指向函数,函数的参数能接收变量,那么一个函数就可以接收另一个函数作为参数,这种函数就称之为高阶函数。
def calc(x,y,f):
return f(x)+f(y)
res = calc(4,-5,abs)
print(res)
#输出
9
内置函数
abs()绝对值
all()都为真,True
any()任意值为真,True
callable()能否被调用
chr(98)根据数据找到ascii中对应的字母
ord('b')根据字母找ascii中的数字
globals()把当前程序所在内存里的所有数据都以字典形式打印出来
local()
power()次方
frozenset()
reversed()反转
round()四舍五入
slice()
#slice
a = range(20)
pattern = slice(3,8,2)
for i in a[pattern]: #等于a[3:8:2]
print(i)
sorted()
zip()
a = [-5,1,3,5,7,9]
b = [2,4,6,8]
for i in zip(a,b):
print(i)
#输出
(-5, 2)
(1, 4)
(3, 6)
(5, 8)
Day4-python基础之函数的更多相关文章
- Python之路,Day4 - Python基础4 (new版)
Python之路,Day4 - Python基础4 (new版) 本节内容 迭代器&生成器 装饰器 Json & pickle 数据序列化 软件目录结构规范 作业:ATM项目开发 ...
- Day4 - Python基础4 迭代器、装饰器、软件开发规范
Python之路,Day4 - Python基础4 (new版) 本节内容 迭代器&生成器 装饰器 Json & pickle 数据序列化 软件目录结构规范 作业:ATM项目开发 ...
- python基础——匿名函数
python基础——匿名函数 当我们在传入函数时,有些时候,不需要显式地定义函数,直接传入匿名函数更方便. 在Python中,对匿名函数提供了有限支持.还是以map()函数为例,计算f(x)=x2时 ...
- python基础——返回函数
python基础——返回函数 函数作为返回值 高阶函数除了可以接受函数作为参数外,还可以把函数作为结果值返回. 我们来实现一个可变参数的求和.通常情况下,求和的函数是这样定义的: def calc_ ...
- python基础——sorted()函数
python基础——sorted()函数 排序算法 排序也是在程序中经常用到的算法.无论使用冒泡排序还是快速排序,排序的核心是比较两个元素的大小.如果是数字,我们可以直接比较,但如果是字符串或者两个d ...
- python基础——filter函数
python基础——filter函数 Python内建的filter()函数用于过滤序列. 和map()类似,filter()也接收一个函数和一个序列.和map()不同的是,filter()把传入的函 ...
- python基础——匿名函数及递归函数
python基础--匿名函数及递归函数 1 匿名函数语法 匿名函数lambda x: x * x实际上就是: def f(x): return x * x 关键字lambda表示匿名函数,冒号前面的x ...
- 八. Python基础(8)--函数
八. Python基础(8)--函数 1 ● 函数返回布尔值 注意, 自定义的函数也可以是用来作逻辑判断的, 例如内置的startswith()等函数. def check_len(x): ' ...
- python基础之函数详解
Python基础之函数详解 目录 Python基础之函数详解 一.函数的定义 二.函数的调用 三.函数返回值 四.函数的参数 4.1 位置参数 4.2 关键字参数 实参:位置实参和关键字参数的混合使用 ...
- Python学习笔记(一)python基础与函数
1.python基础 1.1输入与输出 输出 用print加上字符串,就可以打印指定的文字或数字 >>> print 'hello, world' hello, world > ...
随机推荐
- Windows on Device 项目实践 4 - 智能风扇制作
在前面的文章中,我们已经学习并且利用Intel Galileo开发板和Windows on Device制作了火焰报警器.感光灯和PWM调光灯.在这个项目中,我们来利用温度传感器和直流电机,完成一个简 ...
- Symantec Backup Exec 2012 Agent for Linux 卸载
本文介绍一下如何卸载Symantec Backup Exec 2012 Agent for Linx.首先我们来看看Symantec_Backup_Exec2012管理员手册的文档介绍: 卸载 Age ...
- 探索RegisterAllAreas
在MVC中注册Area时,我们一般会在相应的区域下定义一个继承与AreaRegistration的类,代码如下: public class AdminAreaRegistration : AreaRe ...
- Echarts 之二——地市联动数据统计
一.简介 通过地图可以更直观地展示各个地区的统计数据,能够更清楚地进行数据分析.有些场景下,我们不仅仅需要对每个地市进行统计分析.更需要对地市一下的区县进行数据统计,并进行联动.此事我们可以通过Ech ...
- 查看C#的dll所依赖.Net版本
Microsoft SDK自带的ildasm.exe工具, 是一个反编译工具, 可以查看编译好后的dll的文件 双击ildasm.exe, 把你要识别的.dll文件拖进来, 就会反编译了. 接着在il ...
- 用html5 js实现浏览器全屏
项目中需要将后台浏览器的窗口全屏,也就是我们点击一个按钮要实现按F11全屏的效果. 在HTML5中,W3C制定了关于全屏的API,就可以实现全屏幕的效果,也可以让页面中的图片,视频等全屏目前只有goo ...
- 鼠标 mouseover和mouseout事件
在div内想实现鼠标移入移出效果,最开始的时候是用了jquery的mouseout和mouseover事件来实现的, $('.product).mouseover(function(){ …… }). ...
- CSS控制TD内的文本超出指定宽度后不换行而用省略号代替
<style type="text/css"> .lineOverflow { width: 100px; border:#000 solid 1px; text-ov ...
- C#基础---Attribute(标签) 和 reflect(反射) 应用
1.Attribute的定义与作用: 公共语言运行时允许你添加类似关键字的描述声明,叫做attributes, 它对程序中的元素进行标注,如类型.字段.方法和属性等.Attributes和Micros ...
- Python 数据类型及其用法
本文总结一下Python中用到的各种数据类型,以及如何使用可以使得我们的代码变得简洁. 基本结构 我们首先要看的是几乎任何语言都具有的数据类型,包括字符串.整型.浮点型以及布尔类型.这些基本数据类型组 ...