python学习之函数

时间:2023-09-19 08:22

函数

什么是函数:就是一堆准备好分代码,在需要时调用这一堆代码

函数的声明,使用关键字def来声明

函数的执行逻辑,要和函数的名字一致

在python中用

# def 函数名()函数要进行的操作

函数定义好之后需要调用才会运行

1.函数的参数

可以按照位置一一对应传入参数,也可以按照变量名传入(此时可以无序)

2.函数的返回值,函数的文档说明

返回值就是函数执行的结果,并不是所有函数都必须要有返回值

return表示一个函数的执行结果

def add(a:int, b:int):"""这是一个注释:param a: :param b: :return: a和b冒号后为建议传入参数类型"""c = a + b#  c只有在函数内部使用,没有返回值则result无法获取函数结果
result = add(1, 2)
print(result ** 4)

函数调用

3.全局变量和局部变量

全局变量在整个py文件中都可以访问

局部变量只能在函数内部访问,在函数内部定义

如果局部变量和全局变量同名,则是在函数内部定义一个新的局部变量,不是修改去全局变量

如果想要在函数内部修改全局变量,使用global方法

内置函数globals可以查看全局变量, locals可以查看局部变量

在python中,只有函数能够分割作用域

4.多个返回值

一般情况下,一个函数最多只会执行一个return语句

特殊情况(finally语句)下,一个函数可能会执行多个return语句

def test(a, b):x = a // by = a % breturn x, y  #返回的本质是元组,用[]包裹则为列表,{}是时字典#可以用列表,元组,字典将返回值作为整体返回print(test(2, 3))

5.函数的缺省函数

默认参数(若没有传递参数,会使用默认值,如果有参数传入,则使用传入的参数)

如:print(”hello world“,end=‘’)

若end未传入则使用默认的换行

如果有位置参数和关键字参数,则位置参数要放在关键字参数之前

6.可变参数的使用

可使用元组或列表打宝传入

*args表示可变位置参数(可变参数会以元组的方式保存到args里,缺省参数需要放在位置参数后)

**kwargs表示关键字可变参数(多出的关键字参数会以字典的形式保存)

7.可变类型和不可变类型传参

def test(a):print('修改前a的内存地址0x%X'%id(a))a=100print('修改后a的内存地址0x%X'%id(a))def demo(nums):print('修改前nums的内存地址0x%X'%id(nums))nums[0]=10print('修改前nums的内存地址0x%X'%id(nums))
x=1
print('修改前x的内存地址0x%X' % id(x))
test(x)
print('修改后x的内存地址0x%X' % id(x))
print(x)y=[3,5,9,4,6,7,0]
print('修改前y的内存地址0x%X' % id(y))
demo(y)
print('修改前y的内存地址0x%X' % id(y))
print(y)
# 修改前x的内存地址0x7FF9BE827110
# 修改前a的内存地址0x7FF9BE827110
# 修改后a的内存地址0x7FF9BE827D70
# 修改后x的内存地址0x7FF9BE827110
# 1
# 修改前y的内存地址0x2232E6D5208
# 修改前nums的内存地址0x2232E6D5208
# 修改前nums的内存地址0x2232E6D5208
# 修改前y的内存地址0x2232E6D5208
# [10, 5, 9, 4, 6, 7, 0]

8.函数的注意事项

函数的三要数:函数名,参数,返回值

在有的编程里,允许函数重名,python中不允许

在python中,如果函数重名,后一个函数会覆盖前一个函数

python里函数名也可以理解为一个变量名

变量名也不能和自定义函数名或内置函数名或内置类重名

9.递归函数的使用

简单来说就是函数内部自己调用自己

递归最重要的是找到出口(停止的条件)

count = 0def test():global countcount += 1print('laji')if count < 5:test()test()def factorial(n):if n == 0:return 1return n * factorial(n - 1)print(factorial(6))

10.匿名函数的使用

除了def可以定义一个函数以外,还能使用lambda表达式定义一个函数

匿名函数用来表达一个简单的函数,调用次数很少,基本上只调用一次

lambda a,b:a+b #匿名函数

调用匿名函数的两种方式:

1)给他定义一个名字

nul=lambda a,b:a+b #匿名函数

2) 把这个函数当作一个参数传给另一个函数使用(使用场景比较多)

def cal(a, b, fn):reslut = fn(a, b)return reslutdef add(x, y):return x + ydef munils(x, y):return x - yprint(cal(9, 7, add))
print(cal(78, 16, munils))
result1 = cal(89, 12, lambda x, y: x + y)
result2 = cal(89, 12, lambda x, y: x - y)
result3 = cal(89, 12, lambda x, y: x * y)
result4 = cal(89, 12, lambda x, y: x / y)
print(result1, result2, result3, result4)

11.sort方法的使用

有几个内置函数和内置类,用到了匿名函数

sorted内置函数,不会改变原有数据,而是生成一个新的结果

字典和字典之间不能使用比较运算,因为缺少比较规则

students = [{'name': 'dear', 'age': 18, 'score': 89},{'name': 'honey', 'age': 21, 'score': 95},{'name': 'henry', 'age': 19, 'score': 78},{'name': 'jerry', 'age': 20, 'score': 98}]def foo(x):return x['age']# print('传入了{}',format(x))students.sort(key=foo)
print(students)

12.filter&map&reduce方法的使用

filter 过滤,python2中是内置函数,python3中是内置类

filter对可迭代对象进行过滤,得到的是一个filter对象

filter可以给定两个参数,第一个参数是函数,第二个参数是可迭代对象

filter结果是一个filter类型的对象,filter也是一个可迭代对象

map:让每个元素都执行函数里的内容

map可以给定两个参数,第一个参数是函数,第二个参数是可迭代对象

reduce以前是一个内置函数

students = [{'name': 'dear', 'age': 18, 'score': 89},{'name': 'honey', 'age': 21, 'score': 95},{'name': 'henry', 'age': 19, 'score': 78},{'name': 'jerry', 'age': 20, 'score': 98}]
nums = [3, 5, 6, 78, 6, 1, 14]def foo(x, y):return x + yprint(reduce(foo, nums))
def bar(x,y):return x+y['age']print(reduce(bar, students, 0))

13.内置函数的总结

abs:取绝对值

all:将所有元素转换成bool值,如果所有转换结果都为True,则结果为True,否则为False

any:将所有元素转换成bool值,如果所有转换结果都为False,则结果为False,否则为True

chr:将字符编码转换成为对应字符

ord:将字符转换成为对应子符编码

dir:列出可用的此方法

divmod:求两个数相除的商和余数

exit:以指定退出码退出程序

globals:用来查看所有全局变量

locals:查看所有局部变量

help:查看帮助文档

bin:转二进制 oct:转八进制 hex:转十六进制

id:获取数据内存地址

iter:获取到可迭代对象的迭代器

isinstance:判断一个对象是否是由一个类创建出来

issubclass:判断一个类是否是另一个类的子类

open:用来打开一个文件

print:打印数据

input:让用户输入内容

pow:求幂运算

len:获取长度

round:四舍五入保留到指定小数位

next;for…in循环的本质就是调用迭代器的next方法

sorted:求和

repr:用字符串的方式表示一个数据

14.高阶函数

#  1.一个函数作为另一个函数的返回值
# 2.一个函数作为另一个函数的参数
# 3.函数内部再定义一个函数
# def foo():
#     print("我是foo,我被调用了")
#     return foo
#
#
# def bar():
#     print("我是bar,我被调用了")
#     return foo
#
#
# bar()  # 我是bar,我被调用了
# bar()()  # 我是bar,我被调用了 我是foo,我被调用了
def foo():print("我是foo,我被调用了")return foodef bar():print("我是bar,我被调用了")return foo()bar()  # 我是bar,我被调用了 我是foo,我被调用了

nonlocal:在一个内部函数中更改一个变量,使不产生新变量

15.计算代码的执行时间

代码运行前,获取一下时间;代码运行完成后,在获取一下时间。time模块可以获取当前的时间

time模块里的time方法,可以获取当前时间的时间戳

时间戳是从1970-01-01 00.00.00 UTC到现在的秒数

16.装饰器的基本使用

def can_play(fn):    def inner(name, game, *args, **kwargs):        clock = kwargs.get('clock', 23)        if clock <= 22:            fn(name, game)        else:print('太晚了,不能玩儿!')    return inner
@can_play
def play_game(name, game):    print('{}正在玩儿{}'.format(name, game))
play_game('zhangsan', '王者荣耀')
play_game('lisi', '绝地求生')
play_game('jerry', '英雄联盟', clock=19)

模块

1、导入模块

模块:在python中一个py文件,就是可以理解为模块

并不是所有py文件都能作为一个模块来导入

如果想让一个py文件能够被导入,模块必须要遵守命名规则

python为了方便开发,提供了很多内置模块

import time  # 使用import+模块名直接导入print(time.time())
# 导入这个模块后,就可以使用这个模块里的方法
time.sleep(3)
from random import randint  # from+模块名+import+函数名,导入一个模块的方法
from math import *  # 导入这个模块里的'所有'方法和变量print(pi)
randint(0, 2)
import datetime as dt  # 导入一个模块并起一个别名
print(dt.MAXYEAR)
from copy import deepcopy as dp #导入模块的方法并起别名

2、常见内置模块

# os:操作系统
# os提供的方法是用来调用操作系统里的方法
# www.mareenoire.info ==>获取操作系统的名字   Windows系列=》nt /非Windows=》posix
import osprint(os.name)
print(os.sep)  # 路径分隔符 windows /   其他 \
print(os.path.abspath('模块.py'))  # 获取文件绝对路径
print(os.path.exists)  # 判断是否存在

(很少用)

hashlib和hmac模块

这两个模块都是用来加密的

import hashlib
import hmac# hashlib模块中主要支持两个算法 ,md5 和 sha加密
# 加密方式:单向加密:只有加密的过程,不能解密  对称加密 非对称加密
# 需要将要加密的内容转换为二进制
num = hashlib.md5()
num.update('abc'.encode('utf8'))
print(num.hexdigest())  # 900150983cd24fb0d6963f7d28e17f72
# 'abc'==>900150983cd24fb0d6963f7d28e17f72

hmac加密可以指定密钥

import uuid# y用来生成一个全局唯一的id
print(uuid.uuid1())
print(16 ** 32)
# uuid3和uuid5是使用传入的字符串根据指定算法所得,固定
print(uuid.uuid3(uuid.NAMESPACE_DNS, 'zhangsan'))
print(uuid.uuid5(uuid.NAMESPACE_DNS, 'zhangsan'))
# uuid4 使用最多
print(uuid.uuid4())

pip

pip命令的使用

# python在查找模块时,在那些路径查找
# pip install用来下载安装一个第三方模块
# pip uninstall用来卸载一个第三方模块
# pip list 用来列出当前环境安装的模块名和版本号
# pip freeze 用来列出当前环境安装的模块名和版本号
# pip freeze > file_name 将安装的模块名华人版本号重定向输出到指定文件
# pip install -r file_name 读取文件里的模块名和版本号并安装
# pip install package_name -i  从指定地址下载(临时修改)
from flask import Flask
import sysprint(Flask.name)print(sys.path)

使用自定义模块

#  自己定义一个模块,其实就是自己写一个py文件
import my_module# 使用 from 模块名 import * 此时使用模块中方法不需要模块名
# 本质是读取模块中的__all__属性,看这个属性理定义了那些变量和函数
# 没有设置__all__会读取所有的除了以_开头的变量和函数
# 以一个下划线开始变量,建议只在模块内部使用,别的模块不要导入
# 使用from 模块名 import *这种方式无法导入
print(my_module.a)
print(my_module.test())
**__name__的使用**
起作用是当直接运行这个py文件时,值是__main__ 如果这个文件作为一个模块,则值是文件名

Copyright© 黑海资讯

鄂ICP备2023014923号