函数

函数

1.函数如何定义、调用:

def mylen():  #定义函数
    name = 'alexaaa'  #字符串
    length = 0
    for char in name:
        length += 1
    print(length)

mylen()     #函数的调用

 

2.return的作用:

def my_max():
    a = 111
    b = 222
    if a > b:
        return a
    else:
        return b

a = my_max()
print('a : ' ,a)
返回值的关键字 return

①return能够返回值

②return可以结束一个函数的执行

 

3.返回None:函数里什么都不写,return 后面没有返回值,return None

4.可返回一个值和多个值:

(1)返回一个值:return可以返回任意内容

(2)多返回值:多个返回值以逗号隔开以元组的形式被返回

5.接收返回值:

(1)返回一个值,接收一个值

(2)返回多少个值就用几个变量去接收,必须不多不少

def find():
    l = [1,2,3,4,5,6]

    for i in l:
        if i % 3 == 0:
            return i
num = find()
print(num)                                     #只能找到从左往右的第一个数



def find2():
    l = [1, 2, 3, 4, 5, 6]
    new_l = []
    for i in l:
        if i%3 == 0:
            new_l.append(i)
    return new_l

n_l = find2()
print(n_l)                                         #可以找到能被3整除的所有数
  
求能被3整除的数

 

def func():
    a = 10
    if a>5:
        # return 1,2,3  #===(1,2,3)
        return [1,2,3]  #===[1,2,3]

a,b,c = func()
print(a,b,c)
return应用

6.参数:

(1)参数可以是任意的数据类型

(2)实参和形参的个数相等

 

7.站在函数调用的角度上:位置传参、关键字传参、混用(先按位置传参,再关键字传参)----都是实参

(1)位置传参

(2)关键字传参

(3)混用

def func(a,b):        #站在函数定义的角度上:位置参数
    print(a,b)

                            #站在调用函数的角度上
func(1,2)               #按照位置传参
func(b=1,a=2)       #按照关键字传参
func(1,b=2)           #混用:先按照位置传参,在按照关键字传参
调用传参
定义一个函数,接收两个参数(列表):返回最长的列表
def func(lista,listb):
    if len(lista)>len(listb):
        return lista
    else:
        return listb
li=[1,2,3]
li1=[1,2,4,5]
print(func(li,li1))             #位置传参
返回最长列表

 

8.站在函数定义的角度上:位置参数、动态参数(*)、默认参数、动态参数(**)----都是形参

(1)默认参数:可以不传,不传的话默认是设置的默认值,如果传就

             用传入的值;默认的值在定义阶段就确定了

def welcome(name,sex='male'):   #sex默认参数
    print('welcome,%s,sex:%s'%(name,sex))
welcome('ss')
welcome('dd')
welcome('qq','female')
默认参数

(2)默认参数陷阱,只针对可变的数据类型

def age(age,my_age=18):
    if  age>my_age:
        return  False
    else:
        return True
a=18
def age(a1,a2=a):

    print(a1,a2)
a=20
age(10)       #永远是18
例1
 demo3(a=[]):
    a.append(1)
    print(a)
demo3()
demo3()
demo3()
demo3([])
demo3([])
demo3([])
例2
def func(l=[]):
    l.append(123)
    print(l)
func()
func([])
func()
例3

(3)动态参数:(*args,**kwargs)接收参数个数不确定的时候
     ①站在函数定义的角度上:*做聚合用,将一个一个的参数组合成一个元组

       站在函数调用的角度上:*做打散用,讲一个列表或元组打散成多个参数

       *只针对按位置传参

     ②**kwargs:接收按关键字传递过来的参数,组织成一个字典

def demo4(**kwargs):
    print(kwargs)
# demo4(a=1,b=2,c=3)
d={'a':1,'b':2,'c':3}
demo4(**d)
例1
def demo5(*args,**kwargs):
    print(args)
    print(kwargs)
demo5(1,2,3,a=10,b=20)   #必须先位置传参,再关键字传参
例2
def func(位置参数1,位置参数2,*args,默认参数=10,**kwargs):
    print(位置参数1,位置参数2)
    print(默认参数)
    print(args)
    print(kwargs)
func(1,5,3,4,5,默认参数='dddd',a=2,b=5)
func(1,2,3,4,5,a=10,b=20)
例3


9.函数的嵌套定义:

def func():
    print(123)
    def func2():
        print(234)
    func2()
func()

嵌套函数:为了保证某些功能特有的函数不被其他人随意调用

def func(x,y,z):
    print(x,y,z)
    def func_inner(a,b,c):
        print('func_inner',a,b,c)
    func_inner(x,y,z)
func(4,5,6)
例1
def func(*args,**kwargs):
   print(args)
   print(kwargs)
   def func_inner(a,b,c):
        print('func_inner',a,b,c)
   func_inner(*args,**kwargs)
func(1,b=2,c=3)
例2

 

10.三元运算:

a=10
b=15
c=a if a>b else b
print(c)

结果=if条件成立的结果else条件不成立的结果

11.启动python时:

  (1)先加载内置的命名空间

  (2)再加载全局命名空间的名字--从上到下去加载

  (3)最后加载局部命名空间的名字--调用该函数的时候,从上到下去加载

12.函数命名空间分为:内置命名空间、全局命名空间、局部命名空间;

  全局命名空间,除了函数内部的名字之外,我们自己的代码里所有的名字;

  局部命名空间:函数内部的

13.局部可以使用全局命名空间的名字,但全局不可以使用局部的命名空间;对于局部来说,自己    有用自己的,自己没有用全局的

14.函数的作用域

(1)内置的命名空间:在任意地方都可以用

(2)全局的命名空间:在我们写的代码的任意地方用

(3)局部的命名空间:只能在自己的函数内使用

a=1
def demo1():
    a='demo1'
    print(a)
demo1()
print(a)


a=1
def demo1():
   def demo2():
        a=3
        print(a)
   demo2()
   print(a)
demo1()
print(a)
作用域

范围从大到小:内置命名空间--全局命名空间--局部命名空间

作用域:站在范围小的局部,局部有用局部,局部没有往上一层找,找到第一个可用的名字就用这个

a=0
def demo1():
    b=5
    print(globals())
    print(locals())
demo1()


 a=0
 def demo1(a):
     global a
     a=5
     print(a)


a=0
def demo1():
    a=1
    def demo2():
        nonlocal a
        a=2
        print(a)
    demo2()
    print(a)

demo1()
print(a)

demo1()
print(a)


a=0
def demo1():
    a=1
    def demo2():
        nonlocal a
        a=2
        print(a)
    demo2()
    print(a)

demo1()
print(a)

demo1()
print(a)
global   修改全局命名空间里的变量值
nonlocal   只修改局部命名空间里的,从内部到外部找到第一层
View Code

15.函数的名字:

(1)可以当做变量使用,函数是第一类对象

(2)是一个函数的内存地址

(3)可以赋值,可以作为其它列表等容器类型的元素

(4)可以作为函数的参数,作为函数的返回值

def alex():
    print(123)
a=alex
l=[alex]

print(alex)
print(l[0])
l[0]()





def alex():
    print(123)

def func():
    return alex
print(func())
View Code

16.闭包函数:内部函数引用了外部函数的变量,内部函数就叫做闭包函数

def func():   #外部函数
    name='egon'

    def inner():   #内部函数
       print(name)

    return inner
inner=func()
inner()
print(inner)
闭包函数

17.闭包的作用:在代码不改变的情况下,让代码只创建一次内存空间

import time
def timmer(func):
    #函数名可以当做函数的参数
    def inner():
        start=time.time()
        func()
        end=time.time()
        print(end-start)
def hahaha():
    time.sleep(0.1)
    print('aaaa')
#hahaha()
timmer(hahaha)
不能修改这个函数的调用方式
也不能修改原代码

hahaha=timmer  #timmer函数的地址给了hahaha
hahaha(hahaha)#实际上执行的是timmer
闭包函数

18.闭包的应用:

(1)装饰器:在不改变原函数调用方式的情况下,在这个函数前后加上扩展功能

格式:
def timmer(func):
    def inner(*args,**kwargs):
        '''添加函数调用之前的扩展代码'''
        ret=func(*args,**kwargs)
        '''添加函数调用之后的扩展代码'''
        return ret
    return inner

例子:
def wrapper(func):#装饰
    def inner(*args,**kwargs):

        ret=func(*args,**kwargs)

        return ret
    return inner
@wrapper
def aaa():
    print('dddddd')

aaa()
装饰器
import time
def wrapper(func):#装饰
    def inner(*args,**kwargs):
        start=time.time()
        ret=func(*args,**kwargs)
        end=time.time()
        print(end-start)
        return ret
    return inner


@wrapper
def lll():
    time.sleep(0.2)
    print('hello')
lll()
例子

(2)爬虫:从网页上爬取信息

from urllib.request import urlopen
def get_url():
    url='http://www.cnblogs.com/Eva-J/articles/7156261.html'
    def inner():
        ret=urlopen(url).read()
        return ret
    return inner
get_web=get_url()
res=get_web()
print(res)
爬虫

 

 

           

 

posted @ 2017-10-30 14:35  星雨5213  阅读(98)  评论(0)    收藏  举报