Ai达人养成营 python第三堂,笔记:

课节3: Python函数基础

定义

函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段。

函数能提高应用的模块性,和代码的重复利用率。你已经知道Python提供了许多内建函数,比如print()。但你也可以自己创建函数,这被叫做用户自定义函数。

  • 函数代码块以 def 关键词开头,后接函数标识符名称和圆括号()。
  • 任何传入参数和自变量必须放在圆括号中间。圆括号之间可以用于定义参数。
  • 函数的第一行语句可以选择性地使用文档字符串—用于存放函数说明。
  • 函数内容以冒号起始,并且缩进。
  • return [表达式] 结束函数,选择性地返回一个值给调用方。不带表达式的return相当于返回 None。

定义一个函数;函数调用

1.
def student_name(name):
    "打印学生的名字"
    print('姓名:', name)
    return {'姓名':name}

rst = student_name('Alice')
rst 

例2.
# 返回多个值
def student_name_and_age():
    "记录学生的名字和年龄"
    name = input('请输入姓名\n')
    age = int(input('请输入年龄\n'))
    print(f'姓名:{name};年龄:{age}')
    return name,age                       #注意python可以有多个返回值,这跟c/c++不同

rst = student_name_and_age()
type(rst)                                 #type()函数用于获取对象的类型

name, age = student_name_and_age()3.
## 函数的嵌套调用
def worker(s):
    rst = 10 / float(s)
    return rst

def group_leader(s):
    rst = worker(s) * 2
    return rst

def CTO(s):
    return group_leader(s)

CTO('4')

参数传递

位置参数

定义

位置参数是最简单的一种函数调用的方式。位置参数须以正确的顺序传入函数、数量必须和声明时的一样。

实例
def student_name_and_age(name, age):
    print('姓名:%s 年龄 %s' %(name, age))
    
student_name_and_age('张三', 18)

### 缺省参数

#### 定义

调用函数时,缺省参数的值如果没有传入,则被认为是默认值,当然也可以传入参数。

实例
def student_name_and_age(name, age='不愿透露'):
    "设置默认参数"
    print('姓名:%s 年龄 %s' %(name, age))

student_name_and_age('张三')
student_name_and_age('张三', 18)

可变参数

定义

传入参数可以是任意个,这些可变参数在函数调用时自动组装为一个tuple(元组)。

实例
def all_student_names(*names):
    for name in names:
        print('姓名:', name)
        
all_student_names('张三','李四','王五')

关键字参数

定义

关键字参数允许你传入0个或任意个含参数名的参数(以字典形式传入),这些关键字参数在函数内部自动组装为一个dict(字典)

实例
def score_info(name, **kw):
    if '语文成绩' in kw:
        print(name, '的语文成绩', kw['语文成绩'])
    if '数学成绩' in kw:
        print(name, '的数学成绩', kw['数学成绩'])
        
def person_info(name, age, **kw):
    print('姓名:', name, '年龄',age)
    score_info(name, **kw)    

score_cfg = {'语文成绩':65, '数学成绩':60}#定义字典方式传入
person_info('张三', 18, **score_cfg)

命名关键字参数

定义

如果要限制关键字参数的名字,就可以用命名关键字参数

实例
def print_person_info(name, age, *, height, weight):# *号后面的都是命名关键字参数
    print('我的名字叫:', name, '年龄:', age,'身高', height, '体重', weight)
    
print_person_info('张三', 18, height=180, weight=75)

参数的组合

定义

在Python中定义函数,可以用必选参数、默认参数、可变参数、关键字参数和命名关键字参数,这5种参数都可以组合使用。但是请注意,参数定义的顺序必须是:必选参数、默认参数、可变参数、命名关键字参数和关键字参数。

实例
def student_info(name, age=18, *books, **kw):
    print('我的名字叫:', name, '年龄:', age,'其它信息:',kw)
    if 'city' in kw:
        print('来自:', kw['city'])
    for book in books:
        print('我有',book,'书')
        
 student_info('张三', 18, '语文','数学','计算机', city='北京', height=180, weight=75)

## 变量的作用域和global变量

定义

1.局部变量 作用域:在函数内

2.全局变量 作用域:在函数外

函数优先使用局部变量 在没有局部变量的情况下, 使用全局变量

实例
def change_my_name():
   print('我的名字曾经是', name)
   name = '李四'
   print('我的名字现在是', name)

name = '张三'
change_my_name()
name

lambda匿名函数

定义

python 使用 lambda 来创建匿名函数。

lambda 只是一个表达式,函数体比 def 简单很多。

lambda 的主体是一个表达式,而不是一个代码块。仅仅能在 lambda 表达式中封装有限的逻辑进去。

lambda 函数拥有自己的命名空间,且不能访问自有参数列表之外或全局命名空间里的参数。

虽然 lambda 函数看起来只能写一行,却不等同于 C 或 C++ 的内联函数,后者的目的是调用小函数时不占用栈内存从而增加运行效率。

实例
lambda arg1, arg2: arg1 + arg2
(lambda arg1, arg2: arg1 + arg2 )(1, 2)
# 加法运算 接受两个参数,返回参数之和
add = lambda arg1, arg2: arg1 + arg2
add(1,2)

## 高阶函数

函数名其实就是指向函数的变量

比如:print本身是一个内建函数

例子:

my_print = print 
my_print('a')

函数的名字也可以作为一个变量,传入其它函数

def func_x(x, f):
    return f(x)
    
func_x(-1, abs)

一个函数可以接收另一个函数作为参数,这种函数就称之为高阶函数。

def func_xy(x, y ,f):
    return f(x,y)

add = lambda x,y : x+y 
mul = lambda x,y : x*y 
SS = lambda x,y : x**2 + y**2

print(func_xy(1,2,add))
print(func_xy(1,2,mul))
print(func_xy(1,2,SS))

map / reduce

map()函数接收两个参数,一个是函数,一个是Iterable,map将传入的函数依次作用到序列的每个元素,并把结果作为新的Iterator返回。

例子

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

map(fx, ls)


int2str = lambda x : str(x)
rst = map(int2str, ls)
list(rst)

reduce: 用传给 reduce 中的函数 function(有两个参数)先对集合中的第 1、2 个元素进行操作,得到的结果再与第三个数据用 function 函数运算,依此类推,最后得到一个结果。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jsyDDYgk-1637062006515)(C:\Users\Admin\AppData\Roaming\Typora\typora-user-images\image-20211116181222932.png)]

from functools import reduce #reduce 在functool这个包中。import表示引用此包。
mul_xy = lambda x, y: x+y
reduce(mul_xy, [1,5,32,87])

sorted

在日常中使用非常广泛。

扩展:

(14条消息) sort函数的排序原理_洛阳处处是月明的博客-CSDN博客_sort排序原理

sorted([36, 5, -12, 9, -21])#默认升序
sorted([36, 5, -12, 9, -21], reverse=True)#通过设置reverse=True
sorted([36, 5, -12, 9, -21], key=abs)#用方法kye=abs ,对其进行绝对值排序。


points = [(5,2), (7,3), (3,4),(1,1),(2,6)]

f_x = lambda x:x[0] # 按x坐标排序
sorted(points, key=f_x)

f_y = lambda x:x[1] #  y坐标排序
sorted(points, key=f_y)

f_r = lambda x:x[0]**2+x[1]#和0点距离排序
sorted(points, key=f_r)

装饰器

函数作为返回值

def lazy_sum(*args):
    def sum():
        ax = 0
        for n in args:
            ax = ax + n
        return ax
    return sum  #python 可以通过return 进行返回操作,我们返回一个函数,相当于调用这个函数,在返回这个函数的结果。
#与下面是等价的。
def lazy_sum(*args):
    def sum():
        ax = 0
        for n in args:
            ax = ax + n
        return ax
    x=sum
    return x

闭包

定义

python中的闭包从表现形式上定义(解释)为:如果在一个内部函数里,对在外部作用域(但不是在全局作用域)的变量进行引用,那么内部函数就被认为是闭包(closure).

实例

def create_pointer(my_string):
    def pointer(n):
        return my_string[n]
    return pointer#返回一个函数,上面我们说过函数也可以相当于一个变量。


pointer = create_pointer('my name is Molly')#调用create_pointer函数,返回pointer函数,将'my name is Molly'字符串传入

pointer(5)#调用pointer函数。

注意:返回函数不要引用任何循环变量,或者后续会发生变化的变量。

装饰器

定义

顾名思义,从字面意思就可以理解,它是用来"装饰"Python的工具,使得代码更具有Python简洁的风格。换句话说,它是一种函数的函数,因为装饰器传入的参数就是一个函数,然后通过实现各种功能来对这个函数的功能进行增强。

装饰器最大的优势是用于解决重复性的操作,其主要使用的场景有如下几个:

  • 计算函数运行时间
  • 给函数打日志
  • 类型检查
# 装饰器输入一个函数,输出一个函数
def print_working(func):#这里收到函数
    def wrapper():
        print(f'{func.__name__} is working...')#使用func._name_函数,输出此函数的name
        func()#调用此函数。
    return wrapper
    
 def worker1():
    print('我是一个勤劳的工作者!')
def worker2():
    print('我是一个勤劳的工作者!')
def worker3():
    print('我是一个勤劳的工作者!')

worker1 = print_working(worker1)#将worker1这个函数传入进去
worker1()
worker2= print_working(worker2)
worker2()

偏函数

定义

通过设定参数的默认值,降低函数调用的难度

实例

def student_info(name, age, city='北京'):
    print(f'我的名字叫{name}, 今年{age}岁,来自{city}')
    
student_info('Molly',18)

from functools import partial#引入functools中的偏函数

def student_info(name, age, city):
    print(f'我的名字叫{name}, 今年{age}岁,来自{city}')

student_info_beijing = partial(student_info, city='北京')#设置偏函数,将city设置默认值。

student_info_beijing('Molly',18)

student_info_beijing('Molly',18, city='上海')

模块

import time#就是引入模块
安装/卸载第三方模块
  • pip install / uninstall
  • conda install / uninstall

参考:

student_info(‘Molly’,18)

from functools import partial#引入functools中的偏函数

def student_info(name, age, city):
print(f’我的名字叫{name}, 今年{age}岁,来自{city}’)

student_info_beijing = partial(student_info, city=‘北京’)#设置偏函数,将city设置默认值。

student_info_beijing(‘Molly’,18)

student_info_beijing(‘Molly’,18, city=‘上海’)


# 模块

```python
import time#就是引入模块
安装/卸载第三方模块
  • pip install / uninstall
  • conda install / uninstall

参考:

飞桨AI Studio课程_学习成就梦想,AI遇见未来_AI课程 - 飞桨AI Studio - 人工智能学习实训社区 (baidu.com)

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值