Python入门基础学习五

------------恢复内容开始------------

------------恢复内容开始------------

函数

 

 1 python中函数定义方法:
 2 
 3 def test(x):
 4         "the function definitions"
 5         x+=1
 6         return x
 7 
 8 def :定义函数的关键字
 9 test : 函数名
10 () :内可定义形参
11  “”   :文档描述(非必要,但是强烈建议为你的函数添加描述信息)
12 x+=1:泛指代码块或程序处理逻辑
13 return:定义放回值
14 
15 
16 调用运行:可以带参数也可以不带

使用函数的好处

1、代码重用

2、保持一致性,易维护

3、可拓展性

函数和过程

def test01():
    msg = "test01"
    print(msg)
def test02():
    msg = "test02"
    print(msg)
    return msg
def test03():
    msg = "test03"
    print(msg)
    return 1,2,3,4,"a",["alex"],{"name":"elex"}
t1 = test01()
t2 = test02()
t3 = test03()
print(t1)
print(t2)
print(t3)

总结:

1、返回值数 = 0;返回None

2、返回值数 = 1;返回object

3、返回值数 > 1;返回tuple

函数参数

 

位置参数/关键字

位置参数必须在关键字参数左边

def test(x,y,z):
    print(x)
    print(y)
    print(z)
#位置参数,必须一一对应,缺一不行 少一也不行
# test(1,2,3)
#关键字参数,无须一一对应,缺一不行多一页不行
# test(y=1,x=2,z=3)
#位置参数必须在关键字参数前面
#test(1,y=2,3)#报错
#test(1,3,y=2)#报错
# test(1,3,z=5)
#test(1,3,z=2,y=4)#报错

默认参数

def handle(x,type="alxe"):
    print(x)
    print(type)
handle("hello")
handle("hello",type="123")
handle("hello","12312")

参数组

def test(x,*args):
    print(x)
    print(args)
    print(args[0][0])
# test(1)
# test(1,2,3,4)
# test(1,{"name":"alex"})
# test(1,["a","b","c"],{"alex":"21"})
# test(1,*["a","b","c"])
# test(1,["a","b","c"])
def test(x,*args,**kwargs):
    print(x)
    print(args)
    print(kwargs)
# test(1,y=2,z=3)
test(1,2,3,4,5,6,y=2,z=3)
test(1,*[1,2,3],**{"a":1})

 

全局变量与局部变量

NAME = "alex" #全局变量

def change_name():
    print("我的名字", NAME)
change_name()

def change_name():
    name = "帅的一逼" #局部变量
    print("我的名字", name)
change_name()

def change_name():
    global NAME #把以下全局变量全改掉
    NAME = "酷的一逼"
    print("我的名字", NAME)
change_name()
#如果函数的内容无global关键字,优先读取局部变量,能读取全局变量,无法对全局变量重新赋值
#   有声明局部变量
# NAME = {"产品经理", "无敌"}
# def zhangzan():
#     NAME = "自己"
#     print("我哟搞", NAME)
# zhangzan()

#   无声明局部变量
# NAME = ["产品经理", "无敌"]
# def zhangzan():
#     NAME.append("xx00")
#     print("我哟搞", NAME)
# zhangzan()
#如果函数的内容有global关键字,变量本质上就是全局那个变量,可读可赋值
#   有声明局部变量
# NAME = ["产品经理","尿不湿"]
# def zhangzan():
#     global NAME
#     NAME = "自己"
#     print("我要搞", NAME)
# zhangzan()
#错误示例
# NAME = ["产品经理","尿不湿"]
# def zhangzan():
#     NAME = "自己"
#     global NAME
#     print("我要搞", NAME)
# zhangzan()
#   无声明局部变量
# NAME = ["产品经理","尿不湿"]
# def zhangzan():
#     global NAME
#     NAME = ["阿毛"]
#     NAME.append("xx")
#     print("我要搞", NAME)
# zhangzan()

###全局变量变量名大写

###局部变量变量名小写

执行顺序

NAME = "海风" #1
def yongchao():
    name = "黄伟" #3
    print(name) #4
    def canhui():
        name = "刘洋"#6
        print(name) #7
        def yuzhi():
            name = "芦淞"#10
            print(name)#11
        print(name)#8
        yuzhi()#9
    canhui()#5
    print(name)
yongchao() #2
NAME = "刚娘"
def zhangzan():
    NAME = "陈卓"
    def yongchao():
        global NAME
        NAME = "冷静"
    yongchao()
    print(NAME)
print(NAME)
zhangzan()
#刚娘
#陈卓
NAME = "刚娘"
def zhangzan():
    NAME = "陈卓"
    def yongchao():
        nonlocal NAME #nonlocal:指定上一级变量
        NAME = "冷静"
    yongchao()
    print(NAME)
print(NAME)
zhangzan()
print(NAME)
#刚娘
#冷静 
#刚娘

 

前向引用“函数即变量”

def action():
    print("in the action")
    logger()
action()
# #会报错,找不到logger()函数这个变量

def logger():
    print("in the logger")
def action():
    print("in the action")
    logger()
action()
#不会报错,先运行action()函数,再找到logger()变量运行
NAME = "刚娘"

def weihou():
    name = "陈卓"
    def weiweihou():
        global NAME
        NAME = "冷静"
    weiweihou()
    print(name)
print(NAME)
weihou()
print(NAME)
#刚娘
#陈卓
#冷静

 

------------恢复内容结束------------

------------恢复内容开始------------

------------恢复内容开始------------

函数

 

 1 python中函数定义方法:
 2 
 3 def test(x):
 4         "the function definitions"
 5         x+=1
 6         return x
 7 
 8 def :定义函数的关键字
 9 test : 函数名
10 () :内可定义形参
11  “”   :文档描述(非必要,但是强烈建议为你的函数添加描述信息)
12 x+=1:泛指代码块或程序处理逻辑
13 return:定义放回值
14 
15 
16 调用运行:可以带参数也可以不带

使用函数的好处

1、代码重用

2、保持一致性,易维护

3、可拓展性

函数和过程

def test01():
    msg = "test01"
    print(msg)
def test02():
    msg = "test02"
    print(msg)
    return msg
def test03():
    msg = "test03"
    print(msg)
    return 1,2,3,4,"a",["alex"],{"name":"elex"}
t1 = test01()
t2 = test02()
t3 = test03()
print(t1)
print(t2)
print(t3)

总结:

1、返回值数 = 0;返回None

2、返回值数 = 1;返回object

3、返回值数 > 1;返回tuple

函数参数

 

位置参数/关键字

位置参数必须在关键字参数左边

def test(x,y,z):
    print(x)
    print(y)
    print(z)
#位置参数,必须一一对应,缺一不行 少一也不行
# test(1,2,3)
#关键字参数,无须一一对应,缺一不行多一页不行
# test(y=1,x=2,z=3)
#位置参数必须在关键字参数前面
#test(1,y=2,3)#报错
#test(1,3,y=2)#报错
# test(1,3,z=5)
#test(1,3,z=2,y=4)#报错

默认参数

def handle(x,type="alxe"):
    print(x)
    print(type)
handle("hello")
handle("hello",type="123")
handle("hello","12312")

参数组

def test(x,*args):
    print(x)
    print(args)
    print(args[0][0])
# test(1)
# test(1,2,3,4)
# test(1,{"name":"alex"})
# test(1,["a","b","c"],{"alex":"21"})
# test(1,*["a","b","c"])
# test(1,["a","b","c"])
def test(x,*args,**kwargs):
    print(x)
    print(args)
    print(kwargs)
# test(1,y=2,z=3)
test(1,2,3,4,5,6,y=2,z=3)
test(1,*[1,2,3],**{"a":1})

 

全局变量与局部变量

NAME = "alex" #全局变量

def change_name():
    print("我的名字", NAME)
change_name()

def change_name():
    name = "帅的一逼" #局部变量
    print("我的名字", name)
change_name()

def change_name():
    global NAME #把以下全局变量全改掉
    NAME = "酷的一逼"
    print("我的名字", NAME)
change_name()
#如果函数的内容无global关键字,优先读取局部变量,能读取全局变量,无法对全局变量重新赋值
#   有声明局部变量
# NAME = {"产品经理", "无敌"}
# def zhangzan():
#     NAME = "自己"
#     print("我哟搞", NAME)
# zhangzan()

#   无声明局部变量
# NAME = ["产品经理", "无敌"]
# def zhangzan():
#     NAME.append("xx00")
#     print("我哟搞", NAME)
# zhangzan()
#如果函数的内容有global关键字,变量本质上就是全局那个变量,可读可赋值
#   有声明局部变量
# NAME = ["产品经理","尿不湿"]
# def zhangzan():
#     global NAME
#     NAME = "自己"
#     print("我要搞", NAME)
# zhangzan()
#错误示例
# NAME = ["产品经理","尿不湿"]
# def zhangzan():
#     NAME = "自己"
#     global NAME
#     print("我要搞", NAME)
# zhangzan()
#   无声明局部变量
# NAME = ["产品经理","尿不湿"]
# def zhangzan():
#     global NAME
#     NAME = ["阿毛"]
#     NAME.append("xx")
#     print("我要搞", NAME)
# zhangzan()

###全局变量变量名大写

###局部变量变量名小写

执行顺序

NAME = "海风" #1
def yongchao():
    name = "黄伟" #3
    print(name) #4
    def canhui():
        name = "刘洋"#6
        print(name) #7
        def yuzhi():
            name = "芦淞"#10
            print(name)#11
        print(name)#8
        yuzhi()#9
    canhui()#5
    print(name)
yongchao() #2
NAME = "刚娘"
def zhangzan():
    NAME = "陈卓"
    def yongchao():
        global NAME
        NAME = "冷静"
    yongchao()
    print(NAME)
print(NAME)
zhangzan()
#刚娘
#陈卓
NAME = "刚娘"
def zhangzan():
    NAME = "陈卓"
    def yongchao():
        nonlocal NAME #nonlocal:指定上一级变量
        NAME = "冷静"
    yongchao()
    print(NAME)
print(NAME)
zhangzan()
print(NAME)
#刚娘
#冷静 
#刚娘

 

前向引用“函数即变量”

def action():
    print("in the action")
    logger()
action()
# #会报错,找不到logger()函数这个变量

def logger():
    print("in the logger")
def action():
    print("in the action")
    logger()
action()
#不会报错,先运行action()函数,再找到logger()变量运行
NAME = "刚娘"

def weihou():
    name = "陈卓"
    def weiweihou():
        global NAME
        NAME = "冷静"
    weiweihou()
    print(name)
print(NAME)
weihou()
print(NAME)
#刚娘
#陈卓
#冷静

 

name = "Alex"
 
def change_name():
    name = "Alex2"
 
    def change_name2():
        name = "Alex3"
        print("第3层打印",name)
 
    change_name2() #调用内层函数
    print("第2层打印",name)
 
 
change_name()
print("最外层打印",name)

 

name = "alex"
def foo():
    name = "lhf"
    def bar():
        name = "wupeiqi"
        def tt():
            print(name)
        return tt
    return bar
func = foo()
func()()
name = "alxe"   #匿名函数
# def change_name(x):
#      return  name+"_sb"
# res=change_name(name)
# print(res)
f=lambda x:name+"_sb"
f(name)
print(f(name))
f=lambda x,y,z:(x+1,y+1,z+1)
print(f(1,1,1))

递归调动

def calc(n):
    print(n)
    if int(n/2) == 0:
        return n
    return calc(int(n/2))
calc(10)
__author__="linhaifeng"
import time

person_list=["alex","wupeiqi","yuanhao","lihaifeng"]
def ask_way(person_list):
    print("-"*60)
    if len(person_list) == 0:
        return "没人知道"
    person = person_list.pop(0)
    if person == "lihaifeng":
        return "%s说:我知道,老男孩就在沙河汇的商厦,下地铁就是" %person
    print("hi,美男[%s],敢问路在何方"%person)
    print("%s回答道:我不知道,但念你慧眼识珠,你等着,我帮你问问%s..."%(person,person_list))
    time.sleep(3)
    res = ask_way((person_list))
    print("%s问的结果是:%s"%(person,res))
    return res

res = ask_way(person_list)
print(res)

递归特性:

1、必须有一个明确的结束条件

2、每次进入更深一层递归时,问题规模比上次递归都应有所减少

3、递归效率不高,递归层次过多会导致栈溢出(在计算机中,函数调用是通过栈(stack)这种数据结构实现的,每当进入一个函数调用,栈就会加一层栈帧,每当函数返回,栈就会减一层栈帧。由于栈的大小不是无限的,所以,递归调用的次数过多,会导致栈溢出)

 

函数式编程

把函数当做参数传给另外一个函数

def foo(n):
    print(n)

def bar(name):
    print("my name is %s"%name)

foo(bar)
# foo(bar())#报错
foo(bar("alex"))

返回值中包含函数

def bar():
    print("from bar")
def foo():
    print("from foo")
    return  bar

n=foo()
n()

 高阶函数:1、函数接收的参数是一个函数名;2、返回值中包含函数。二者满足其一就是高阶函数

MAP函数

num_l=[1,2,3,4,5,7]
ret = []
for i in num_l:
    ret.append(i**2)
print(ret)


def map_test(array):
    ret = []
    for i  in num_l:
        ret.append(i**2)
    return ret
ret=map_test(num_l)
print(ret)
print(map_test(num_l))


num_l = [1,2,3,4,5,7]
def add_one(x):
    return x+1
def reduce_one(x):
    return x-1
def pf(x):
    return x**2
def map_test(func,array):
    ret = []
    for i in num_l:
        res = func(i)
        ret.append(res)
    return ret
print(map_test(add_one,num_l))
print(map_test(reduce_one,num_l))
print(map_test(pf,num_l))


num_l = [1,2,3,4,5,7]
def map_test(func,array):
    ret = []
    for i in num_l:
        res = func(i)
        ret.append(res)
    return ret
print(map_test(lambda x:x+1 , num_l))
print(map_test(lambda x:x-1,num_l))
print(map_test(lambda x:x**2,num_l))


num_l = [1,2,3,4,5,7]
def map_test(func,array):
    ret = []
    for i in num_l:
        res = func(i)
        ret.append(res)
    return ret
res = map(lambda x:x**2,num_l)
print(list(res))
print("传的是有名函数", list(map(lambda x:x+1,num_l)))
#具体看函数,若比较复杂,不为lambda需重新定义


num_l = [1,2,3,4,5,7]
res = map(lambda x:x**2,num_l)
print(list(res))
print("传的是有名函数", list(map(lambda x:x+1,num_l)))

 filter函数

movie_people = ["alex_sb","wupeiqi_sb","linhaifeng","yuanhao_sb"]

def sb_show(n):
    return n.endswith("sb")

def filter_test(func,array):
    ret=[]
    for p in array :
        if not func(p):
            ret.append(p)
    return ret
res = filter_test(sb_show,movie_people)
print(res)
movie_people = ["alex_sb","wupeiqi_sb","linhaifeng","yuanhao_sb"]
def sb_show(n):
    return n.endswith("sb")

def filter_test(func,array):
    ret=[]
    for p in array :
        if not func(p):
            ret.append(p)
    return ret
print(list(filter_test(lambda n:n.endswith("sb"),movie_people)))
#filter函数
movie_people = ["alex_sb","wupeiqi_sb","linhaifeng","yuanhao_sb"]
print(list(filter(lambda n:not n.endswith("sb") , movie_people)))

reduce函数

from  functools import  reduce
num_l=[1,2,3,100]
print(reduce(lambda x,y:x*y , num_l))
print(reduce(lambda x,y:x*y , num_l,100))
print(reduce(lambda x,y:x+y , num_l,))
print(reduce(lambda x,y:x+y , num_l,1))
num_l = [1,2,3,100]
def reduce_test(array):
    res=0
    for num in array:
        res+=num
    return res
print(reduce_test(num_l))
num_l = [1,2,3,100]
def reduce_test(func,array):
    res = 1
    for num in array:
        res=func(res,num)
    return res
print(reduce_test(lambda x,y:x*y,num_l))
num_l = [1,2,3,100]
def reduce_test(func,array):
    res=array.pop(0)
    for num in array:
        res=func(res,num)
    return res
print(reduce_test(lambda x,y: x*y ,num_l))
#filter遍历序列中每个元素,判断每个元素得到布尔值,如果Ture则留下来
people=[
    {"name":"linhaifeng","age":1000},
    {"name":"wupei","age":1000},
    {"name":"yuanhao","age":9000},
    {"name":"wangwei","age":18}
]
print(list(filter(lambda p:p["age"]<=18 , people)))
#reduce:处理一个序列,然后吧序列进行合并操作
from functools import  reduce
print(reduce(lambda x,y:x+y , range(100),100))
print(reduce(lambda x,y:x+y , range(1,101)))

 内置函数

print(all([1,2,"1"]))
print(all([1,2,"1",""]))

print(bin(3))#十进制转二进制

#空,None,0的布尔值为False,其余都为True
print(bool(""))
print(bool(None))
print(bool(0))


name="你好"
print(bytes(name,encoding="utf-8"))#把一个字符串转换为字节,编码:encoding
print(bytes(name,encoding="utf-8").decode("utf-8"))  #解码:decode
print(bytes(name,encoding="gbk").decode("gbk"))#用什么编码,就用什么解码
print(chr(97))#ask码表对应做的打印

print(dir(all))#打印某一个对象“all”下面有哪些方法

print(divmod(10,3))#10除3取商得余数,用来做分页功能,10为内容数,3为每页内容,得商为分几页,余数为剩余


dic={"name":"alex"}
dic_str=str(dic)
d1=eval(dic_str) #把字符串中的数据结构提取出来
print(d1)

express="1+2*(3/3-1)-2"
print(eval(express)) #把字符串中的表达式数字运算算出来

#可hash的数据类型即不可变数据类型,不可hash的数据类型即可变数据类型
name="alex"
print(hash(name))
print("-->before",hash(name))
name="sb"
print("-->after",hash(name))


print(bin(10))#10进制->2进制
print(hex(12))#10进制->16进制
print(oct(12))#10进制->8进制

print(isinstance(1,int)) #判断前面类型是否是后面的数据类型
print(isinstance("abc",str))
print(isinstance([],list))

print(globals())#打印全局变量
print(locals())#打印局部变量
l=[1,3,100,-1,2]
print(max(l))   1,max函数处理的是可迭代对象,相当于一个for循环取出每个元素进行比较,注意,不同类型之间不能比较
print(min(l))   1,每个元素之间进行比较,是从每个元素的第一个位置一次比较,如果这一个位置分出大小,后面都不需要比较,直接得出两元素大小
print(list(zip(("a","b","c"),(1,2,3))))#zip传序列类型,列表元组字符串,即可组成

p={'name':'alex','age':18,'gender':'none'}
print(list(zip(p.keys(),p.values())))
print(list(p.keys()))
print(list(p.values()))
print(list(zip("hello","12345")))

age_dic={'age1':18,'age2':20,'age3':100,'age40':30}
print(max(age_dic.values()))
print(list(max(zip(age_dic.values(),age_dic.keys()))))
people=[
    {'name':'alex','age':1000},
    {'name':'wupeiqi','age':10000},
    {'name':'yuanhao','age':900},
    {'name':'linhaifeng','age':18},
]
print(max(people, key=lambda dic:dic["age"]))

# ret=[]
# for item in people:
#     ret.append(item['age'])
# print(ret)
# max(ret)
print(ord("a"))#"a"在ask码表的位置

print(pow(3,3))#3**3
print(pow(3,3,2))#3**3%2

l=[1,2,3,4]
print(list(reversed(l)))#顺序颠倒、
print(l)

print(round(3.5))#四舍五入

l="hello"
s1=slice(3,5)   #切片
print(l[s1])

l=[3,2,1,4,5]
print(sorted(l))  #排序

people=[
    {'name':'alex','age':1000},
    {'name':'wupeiqi','age':10000},
    {'name':'yuanhao','age':900},
    {'name':'linhaifeng','age':18},
]
print(sorted(people,key=lambda dic:dic['age']))

name_dic= {
    'yuanhao':900,
    'alex':200,
    'wupei':300,
}
print(sorted(name_dic,key=lambda key:name_dic[key]))
print(sorted(zip(name_dic.values(),name_dic.keys())))

 

posted @ 2020-04-25 21:19  张张祺  阅读(153)  评论(0)    收藏  举报