学习笔记之Python的函数

一、定义函数

def 函数名称(参数1,参数2):
	函数内语句块
	return 返回值

当参数个数不确定时,可以使用(*参数1)或(**参数1)

一个*的参数:

# 定义函数
def function_name (x,*y):
    print("x = ",x)
    print("y = ",y)
# 调用函数
function_name(1,2,3,4)
>>>
x =  1
y =  (2, 3, 4)

二个*的参数:

# 定义函数
def function_name (x,**y):
    print("x = ",x)
    print("y = ",y)
# 调用函数
function_name(1,a=2,b=3)
>>>
x =  1
y =  {'a': 2, 'b': 3}

二、函数的使用

python 函数的参数传递:

不可变类型:类似 c++ 的值传递,如 整数、字符串、元组。如fun(a),传递的只是a的值,没有影响a对象本身。比如在 fun(a)内部修改 a 的值,只是修改另一个复制的对象,不会影响 a 本身。

可变类型:类似 c++ 的引用传递,如 列表,字典。如 fun(la),则是将 la 真正的传过去,修改后fun外部的la也会受影响

python 中一切都是对象,严格意义我们不能说值传递还是引用传递,我们应该说传不可变对象和传可变对象。

2.1 global和nonlocal区别:

在Python中,global和nonlocal的作用都是可以实现代码块内变量使用外部的同名变量,但其中是有很明显的区别的。

  • global: 很明显就是声明代码块中的变量使用外部全局的同名变量
  • nolocal: 的使用场景就比较单一,它是使用在闭包中的,使变量使用外层的同名变量

2.2 嵌套函数的使用

当一个参数不需要经常更改且反复使用时,可以使用嵌套函数。这样可以先传一个参数,类似于一个常量,之后再传其他的参数就行。

def weight(g):
    def cal_mg(m):
        return m*g
    return cal_mg

f = weight(10)
# 这是的f()已替换为上面的cal_mg函数
g = f(50)
print(g)
>>>
500

2.3 装饰器

可以理解为对函数的一个扩展

#coding:utf-8
import time
from functools import wraps
# 定义装饰器
def timethis(func): 
    @wraps(func)
    def wrapper(*args, **kwargs):
        start = time.time()
        func(*args, **kwargs) 
        end = time.time() 
        print(func.__name__, end - start) 
    return wrapper
# 定义函数
@timethis
def countdown(n):
    while n>0:
        n -= 1

@timethis
def test_list_append():
    lst = []
    for i in range(1000000):
        lst.append(i)

@timethis
def test_list_compre():
    [i for i in range(1000000)]
# 调用函数
countdown(1000000)
countdown(100000000)

test_list_append()
test_list_compre()

2.4 特殊函数

特殊函数: 在调用方法、实现功能、性能方面与其他函数有所差别。

2.4.1 lambda

有些时候,不需要显式地定义函数,直接传入匿名函数更方便。以map()函数为例,计算f(x)=x2时,除了定义一个f(x)的函数外,还可以直接传入匿名函数:

list(map(lambda x: x * x, [1, 2, 3, 4, 5, 6, 7, 8, 9]))

关键字lambda表示匿名函数,冒号前面的x表示函数参数。
匿名函数的限制: 就是只能有一个表达式,不用写return,返回值就是该表达式的结果。
匿名函数的好处: 因为函数没有名字,不必担心函数名冲突。

2.4.2 map:

语法:
map(function, iterable, …)

  • function - 针对每一个迭代调用的函数
  • iterable - 支持迭代的一个或者多个对象。在 Python 中大部分内建对象,例如 lists, dictionaries, 和 tuples 都是可迭代的

第一个参数 function 以 参数序列中的 每一个元素调用 function 函数,返回 包含每次 function 函数返回值的 新列表。假如我们有一个字符串列表,我们想要将每一个元素都转换成大写字母。想要实现这个目的的一种方式是,使用传统的for循环:

for循环:

# 定义列表
directions = ["north", "east", "south", "west"]
directions_upper = []
# 转换
for direction in directions:
    d = direction.upper()
    directions_upper.append(d)
# 打印
print(directions_upper)
>>>
['NORTH', 'EAST', 'SOUTH', 'WEST']

map函数:

# 定义列表
directions = ["north", "east", "south", "west"]
# 借助lambda函数转换
directions_upper = map(lambda s: s.upper(), directions)
# 打印
print(list(directions_upper))
>>>
['NORTH', 'EAST', 'SOUTH', 'WEST']

2.4.3 filter

n = range(-5,5)
# filter:过滤函数
f = filter(lambda x: x>0,n)
print(list(f))
>>>
[1, 2, 3, 4]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值