函数(二)

上节回顾:

1.为何用函数:

解决代码重用问题
提高代码可维护性
程序的组织结构清晰,可读性强

2.定义函数

!!!先定义,后使用
def funcname(arg1,arg2,...):
"""描述信息"""
函数体
return value
无参,
def foo():
print(‘foo‘)

有参,
def my_sum(x,y):
return x+y

3.调用函数

语句形式:foo()
表达式形式:res=my_sum(1,2)
函数调用作为另外一个函数的参数:print(my_sum(1,2))

4.函数返回值

不写return -->None
return 一个值 -->这个值
return 多个值 --> 由这多个值组成的元组

5.函数的参数

形参和实参
def my_sum(x,y):
return x+y
my_sum(1,2)

从实参的角度:
按位置传值my_sum(1,2)
按关键字传值my_sum(y=1,x=2)
混合传值my_sum(1,y=2) #不能对形参重复赋值

从形参角度:
位置参数def foo(x,y,z) #位置参数必须在默认参数左边
默认参数def foo(x,y=1) #定义时变化少的定义成默认参数

什么时候用?
位置参数: 每次调用的时候值都需要变化的
默认参数:定义时变化少的定义成默认参数

二者的特性:
调用时位置参数必须传值,默认参数可传可不传

*args 定义时以元组形式 def foo(x,*args) 调用时多余的值拼成元组给args
foo(1,2,3,4,5)
**kwargs def foo(x,**kwargs) 多余的按关键字传值的拼成字典给kwargs
foo(x=1,y=3,z=3)

函数(二)

1.名称空间和作用域

名称空间
#内置名称空间
#全局名称空间
#局部名称空间

内置名称空间:系统解释器自带的
import builtins
dir(builtins) 看
全局名称空间: 没缩进定格写的
定义完了,全局在哪里都可以用

局部名称空间: 在函数内部定义的

全局作用域:
#内置名称空间
#全局名称空间

局部作用域:
#局部名称空间

找的时候:先找局部,再全局,再内置

def foo():
print(‘from foo‘)
bar()

def bar():
print(‘from bar‘)
foo()

globals 都是针对文件全局locals  文件局部 和内建文件的局部(定义值)

2.函数的嵌套

1.嵌套调用

def my_max(x,y):
    res=x if x > y else y
    return res

print(my_max(10,100))

def my_max4(a,b,c,d):
    res1=my_max(a,b)
    res2=my_max(res1,c)
    res3=my_max(res2,d)
    return res3
print(my_max4(1,20,3,4))

  

100
20

2.嵌套定义

def f1():
    print(‘----->f1‘)
def f2():
    print(‘----->f2‘)
f2()
f1()

----->f2
----->f1
x=11111111
def f1():

    print(‘------->f1‘,x)

def f2():
    x=2
    print(‘----->f2‘,x)
def f3():
    x=3
    print(‘--->f3‘,x)
f3()
f2()
f1()

--->f3 3
----->f2 2
------->f1 11111111

  

3.函数对象与闭包

函数是第一类对象

#函数可以被赋值

f=foo
print(f)
f()

def foo():
  print(foo)

#函数可以被当成参数传递

f=foo
print(f)
f()

def bar(func):
  print(func)

bar(foo)

bar(foo())       则是None

##打印的都是foo的内存地址

#把函数当成返回值

def bar(func):
  print(func)
  return func
f=bar(foo)
print(f)
f()

def search():    print(‘function ------>search‘)def add():    print(‘function ------>add‘)def delete():    print(‘ function------->delete‘)def change():    print(‘ function-------->change‘)

def tell_msg():    msg=‘‘‘    search: 查询    add:添加    delete:删除    change:修改    create:新建    ‘‘‘    print(msg)def create():    print(‘function ------->create‘)cmd_dic={    ‘search‘:search,    ‘add‘:add,    ‘delete‘:delete,    ‘change‘:change,    ‘create‘:create}

while True:    tell_msg()    choice=input(‘please input your choice:‘).strip()    #print(cmd_dic[choice])    cmd_dic[choice]()
x=10000
def f1():
    x=1
    def f2():
        print(x)
    return f2
f=f1()
print(f)
x=123123123
f()

<function f1.<locals>.f2 at 0x00000000009EE268>
1

  

f() 返回f2,找f2的x

闭包

内部函数的代码包括对外部作用域名字的引用,但一定不是对全局名字的引用
#首先必须是内部定义的函数,该函数包含对外部作用域而不是全局作用域名字的应用

x=1
def f1():
    x=2   y=1
    def f2():
        print(x)     y
    return f2

f=f1()
f()
print(f._closure_[0].cell_contents)
print(f._closure_[1].cell_contents)

221

返回f2

  

#print(f.closure_) #验证是不是闭包
print(f._closure_[0].cell_contents) #查看内容
print(f._closure_[1].cell_contents)

def f1(x):
#x=2
def f2():
print(x)

return f2
f=f1(100000000)
f()
#print(f.closure_) #验证是不是闭包
print(f._closure_[0].cell_contents) #查看内容
print(f._closure_[0].cell_contents)

pip install requests 下载模块 #验证闭包的用途
import requests

requests.get(‘http://requests.get(‘http://www.baidu.com‘)
requests.get(‘http://requests.get(‘http://www.baidu.com‘).txt

import urlopen
from urllib.requests import urlopen
def get(url):
return urlopen(url).read()

print(get(‘http://www.python.org‘))

闭包的演变
from urllib.requests import urlopen
def f1(url):
def f2():
print(urlopen(url).read())

return f2

f=f1(‘http://www.python.org‘)

f()

时间: 2024-10-13 17:55:47

函数(二)的相关文章

C#中的函数(二) 有参有返回值的函数

接上一篇 C#中的函数(-) 无参无返回值的函数 http://www.cnblogs.com/fzxiaoyi/p/8502613.html 这次研究下C#中的函数(二) 有参有返回值的函数 依然写一个小例子,用来测试 跟上一个例子差不多,区别就是MyFunction有二个参数a,b,返回二个数相加的值 F5调试运行,中断后转到反汇编 这里很明显看到不同了 这里就得讲到参数传递的方式,参数从左向右依次存入寄存器ecx edx 但是不同的编程语言有不同的传递参数的方式,有空再写一篇文章介绍下 要

0046-简单的分段函数(二)

简单的分段函数(二) 难度级别:A: 运行时间限制:1000ms: 运行空间限制:51200KB: 代码长度限制:2000000B 试题描述 已知下列分段函数,要求编一程序,输入 x,输出相应的 y 的值.分段函数: 输入 一个double类型的数 x 输出 一个double类型的数 y 输入示例 5 输出示例 20 和简单的分段函数(一)异曲同工. 代码: #include<bits/stdc++.h> using namespace std; double x; int main() {

python之内置函数(二)与匿名函数、递归函数初识

一.内置函数(二)1.和数据结构相关(24)列表和元祖(2)list:将一个可迭代对象转化成列表(如果是字典,默认将key作为列表的元素).tuple:将一个可迭代对象转化成元组(如果是字典,默认将key作为元组的元素) 2.相关内置函数(2)reversed:将一个序列翻转,并返回此翻转序列的迭代器. *****slice:构造一个切片模板,用于列表的切片.*** 2-1.reversed()与列表的reverse()区分:列表的reverse()只能列表使用:列表.reverse(),对原列

学习13.内容# 1.内置函数二 # 2.闭包

目录 内置函数二 重要的内置函数和匿名函数 闭包 内置函数二 abs 绝对值 返回的都是正数 print([abd(i) for i in lst]) enumerate 枚举 ("可迭代对象","序号的起始值") 默认起始值是0 [(0,1),(1,2),(2,3)] print([i for i in enumerate(lst,10)]) lst = [11,22,33,-44,23,21] new_lst = [] for i in enumerate(ls

内置函数(二) 闭包

内置函数(二) 内置函数 1.abs( ) print([abs(i) for i in lst]) # 绝对值 -- 返回的都是正数 2.enumerate( ) [(0,1)(1,2)(2,3)] print([i for i in enumerate(lst,10)]) # 枚举("可迭代对象","序号的起始值") 默认的起始值是 0 3.max( ) print(max([1,2,3,4,56,7,8])) # 求最大值 print(max([1,2,-33

15 .内置函数(二),递归函数,二分法

14. 前 方 高能-内置函数 二 本节主要内容: lamda匿匿名函数 sorted() filter() map() 递归函数 一. lamda匿匿名函数为了了解决 一些简单的需求 而设计的 一句句话函数 # 计算n的n次 方 def func(n): return n**n print(func(10)) f = lambda n: n**n print(f(10)) lambda表 示的是匿匿名函数. 不需要 用def来声明,  一句句话就可以声明出 一个函数 语法: 函数名 = lam

第七篇、函数二

一.冒泡排序 li = [15,14,13,12,11] """ 这里是外面套循环轮数,内部循环拿到一个最大值 记住,range的循环不带最后一个 里面循环是拿到一个最大值,然后外面是循环多少轮那就把最大值拿出来了 """ ''' for n in range(1,len(li)): for m in range(len(li)-n): num1 = li[m] num2 = li[m+1] if num1>num2: tmp = num1

python基础10(函数二)

一.函数形参和实参的区别 形参全称是形式参数,在用def关键字定义函数时函数名后面括号里的变量称作为形式参数. 实参全称为实际参数,在调用函数时提供的值或者变量称作为实际参数. >>> def add(a,b): #这里的a和b是形参 return a+b >>> add(1,2) # 这里的1和2是实参 3 >>> x=2 # 这里的x和y是实参 >>> y=3 >>> add(x,y) 5 二.参数的传递和改变

学习AS3菜鸟起飞吧之—函数(二):函数之返回语句

如果希望函数有返回值,必须使用return语句 下面的函数除了输出信息以外,还返回了输出的信息.这时函数的返回类型从void类型变成了“*”类型: var s:String = trace("hello");   function traceMsg(msg:*)   {        trace(msg);        return msg;    } 使用return语句还可以中断函数的执行,这个方式经常会用在判断语句中.如果某条件为false,则不执行后面的代码,直接返回. 下面

python第十天(函数二)

一.默认参数的陷阱 如果在行参中设置一个默认参数为一个空列表那么多次执行函数往里传值,下面的函数会共用这个列表. def func(k,l = {}): l[k] = 'v' print(l) func(1) func(2) func(3) 结果: {1: 'v'}{1: 'v', 2: 'v'}{1: 'v', 2: 'v', 3: 'v'} 二.三元运算(三目运算) 三个条件: 必须要有结果. 必须要有if和else 只可能是简单的情况 x = 4 y =2 a = x if x > y e