笔记补充:
元组就是一个只读列表。
字典:去重,无序。
utf-8 中文占3字节。
只有unicode 有encode方法。
函数按照关键参数或者位置参数,不能重合使用。
局部函数中用global 声明下全局变量。
返回值:
1.一旦你的函数经过调用并开始执行,那你的函数外部的程序没有办法在控制函数的执行过程,此时外部程序只能等待函数结果,
执行结果来决定下一步该怎么走,执行结果以return形式返回给外部。
2.return代表着一个函数的结束
3.return可以返回任意类型数据
4.对于用户角度,函数可以返回任意数量的值,但对于python本身来讲,函数只能返回一个值。
全局变量对函数局部有影响,函数运行中形参为主。函数运行完,形参才会释放掉(递归函数)
温故知新:
1.集合
主要作用:去重,关系测试,交集\差集\并集
>>> a
=
{
1
,
2
,
3
,
4
}
>>> b
=
{
3
,
4
,
5
,
6
}
>>> a
{
1
,
2
,
3
,
4
}
>>>
type
(a)
<
class
'set'
>
>>> a.symmetric_difference(b)
{
1
,
2
,
5
,
6
}
>>> b.symmetric_difference(a)
{
1
,
2
,
5
,
6
}
只读列表,只有count,index 2个方法
作用:如果一些数据不想被人修改,可以存成元组,比如身份证件列表
3.字典
key-value 对
特性:无顺序,去重,查询速度快比列表快多了,比list占用内存多
为什么会查询速度会快呢?因为它是hash类型,拿什么是hash呢?
哈希算法将任意长度的二进制值映射为较短的固定长度的二进制值,这个小的二进制值称为哈希值,哈希值是一段数据唯一且及其紧致的数值形式。如果散列一段明文
而且哪怕只更改段落的一个字母,随后的哈希都将会产生不同的值,dict会把所有的key变成hash 表,然后将这个表进行排序,这样,你通过data[key]去查data字典中一个key的时候,python会先把这个key hash成一个数字,然后拿这个数字到hash表中看没有这个数字, 如果有,拿到这个key在hash表中的索引,拿到这个索引去与此key对应的value的内存地址那取值就可以了。
4.字符编码
python2
python2里默认编码是ascii,文件开头那个编码声明是告诉解释这个代码的程序是以什么编码格式,吧这段代码读入内存,因为到了内存里,这段代码其实是
以bytes二进制格式存的,不过即使是二进制流,也可以按不同的编码格式转换成2进制流,如果在文件头生命了#_*_coding:utf-8 _*_,就可以写中文了
python3
python3里默认文件编码就是utf-8,所以可以直接写成中文,也不需要文件头申明编码了,你声明的变量默认是unicode编码,不是utf-8。
5.函数的基本语法及特性
定义:函数是指将一组语句的集合通过一个名字(函数名)封装起来,要执行这个函数,只需调用其函数名即可
特性:减少重复代码,使程序变得可扩展,是程序变得易维护
语法定义:
def sayhi(): print("hello,i am a boy") sayhi()可以带参数
a,b = 5,8 c = a**b print(c) def calc(x,y): res = x**y return res c = calc(a,b) print(c)6.函数的参数与局部变量
形参变量只有在被调用时才分配内存单元,在调用结束时,即刻释放所分配的内存单元,因此,形参只在函数内部有效,
函数调用结束返回主调函数后则不能再使用该形参变量
实参可以是常量,变量,表达式,函数等,无论实参是何种类型的量,在进行函数调用时,他们都必须有确定的值,以便把这些值传送给形参。
因此应预先用赋值,输入等方法使参数获得确定的值
7.关键参数
看下面代码
def stu_register(name,age,country,course,*args,**kwargs): print(name) print(age) print(country) print(args) print(args) print(kwargs) stu_register(age=12,name="alex",country="Jp",course="dasd") stu_register("王山炮",22,"CN","python_devops","dsad")发现country这个参数,基本都是“CN”,就像我们在网站上注册用户,像国籍这种信息,你不填写,默认就是中国,这就是通过默认参数实现的,把country变成
默认参数非常简单,另外,在把country变成默认参数后,同时把它的位置移到了最后面。
关键参数:正常情况下,给函数传参数按照顺序,不想按顺序可以使用关键参数,只需指定参数名即可,但记住一个要求就是,关键参数必须放在位置参数后面。
8.非固定参数
若你的函数在定义时不确定用户想传入多少个参数,就可以使用非固定参数。
1
2
3
4
5
6
7
8
9
10
|
def
stu_register(name,age,
*
args):
# *args 会把多传入的参数变成一个元组形式
print
(name,age,args)
stu_register(
"Alex"
,
22
)
#输出
#Alex 22 () #后面这个()就是args,只是因为没传值,所以为空
stu_register(
"Jack"
,
32
,
"CN"
,
"Python"
)
#输出
# Jack 32 ('CN', 'Python')
|
还可以有一个**kwargs
1
2
3
4
5
6
7
8
9
10
|
def
stu_register(name,age,
*
args,
*
*
kwargs):
# *kwargs 会把多传入的参数变成一个dict形式
print
(name,age,args,kwargs)
stu_register(
"Alex"
,
22
)
#输出
#Alex 22 () {}#后面这个{}就是kwargs,只是因为没传值,所以为空
stu_register(
"Jack"
,
32
,
"CN"
,
"Python"
,sex
=
"Male"
,province
=
"ShanDong"
)
#输出
# Jack 32 ('CN', 'Python') {'province': 'ShanDong', 'sex': 'Male'}
|
9.局部变量
val = "dasd" print(id(val)) def sayhi(name): print("%s"%name) print(val,id(val)) sayhi("zongyimin")
全局变量与局部
在子程序中定义的变量叫做局部变量,在程序的一开始定义的变量称为全局变量
全局变量作用域是整个程序,局部变量作用域是定义该变量的子程序
当全局白你两和局部变量重名时:在定义局部变量的子程序内,局部变量起作用,在其它地方全局变量起作用。
10.返回值
要想获取函数的执行结果,就可以用return语句把结果返回
注意:
1.函数在执行过程中只要遇到return语句,就会停止执行并返回结果,so也可以理解为return语句代表着函数的结束
2.如果未在函数中指定return,那这个函数的返回值为none
11.强行插入知识点:嵌套函数
name = "Alex" def change_name(): name = "Alex2" def change_name2(): name = "Alex3" print("第3层打印",name) change_name2() #调用内层函数 print("第2层打印",name)
输出结果:
第3层打印 Alex3
第2层打印 Alex2
最外层打印 Alex
12.递归
在函数内部,可以调用其他函数。如果一个函数在内部调用本身,这个函数就是递归函数。
def calc(n): print(n) if int(n/2) ==0: return n return calc(int(n/2)) calc(10)函数遇到return,就停止执行返回结果。
递归特性:
1.必须有一个明确的结束条件
2.每次进入更深一层递归时,问题规模比上一层递归都应有所减少
3.递归效率不高,递归层过多会导致栈溢出
递归函数实例:二分查找
data = range(0,2000,2) print(data) def binary_search(datalist,find_num): if len(datalist) > 0: middle_num = int(len(datalist)/2) if datalist[middle_num] > find_num: print("\033[31;1m going to left side \033[0m") binary_search(datalist[0:middle_num],find_num) else: binary_search(datalist[middle_num+1:],find_num) else: print("cannot find num:%s"%find_num) binary_search(data,20)匿名函数
匿名函数就不需要显示的指定函数
cala = lambda n:n**n print(cala(4))匿名函数主要是和其他函数搭配使用。
res = map(lambda x:x**2,[1,2,3]) for i in res: print(i,type(i))
三元运算:
data3 = map(lambda n:n*2 if n>5 else cala(n),range(10)) for i in data3: print(i)13.函数式编程介绍
函数是面向过程的程序设计的基本单元。
函数式编程中的函数这个术语不是指计算机中的函数,而是只数学中的函数,即自变量的映射,也就是说一个函数的值取决于一个函数参数的值,不依赖其他状态。
比如sqrt()函数计算平方根,只要参数不变,调用几次,值都不变。
简单说:函数式编程是一种编程范式,也就是如何编写程序的方法论。函数是编程语言:erlang,haskell
14.高阶函数
变量可以指向函数,函数的参数能接收变量,那么一个函数就可以接收另一个函数作为参数,这种函数就称之为高阶函数
def add(x,y,f): return f(x)+f(y) res1 = add(3,-3,abs) print(res1)内置函数: