9 函数

作者: 雨小风轻潜入夜 | 来源:发表于2021-07-10 10:06 被阅读0次

1 三元运算

# v1 = 前面 if 条件 else 后面 
data = input('>>>')
value = int(data) if data.isdecimal() else None

2 函数

2.1 函数的基本结构

# 函数的定义
def func(val):  # 形参
    print(val)  # 实参
    pass


func()

2.2 参数

2.2.1 基本参数知识

  • 任意个数
  • 任意类型

2.2.2 位置参数

# 位置参数
def func(n1, n2):
    print(n1, n2)


func(1, 2)
# 严格按照顺序传参数:位置方式传参

2.2.3 关键字传参

def func(n1, n2, n3):
    print(n1, n2, n3)


func(1, n3=2, n2=5)
# 可以和位置传参混合使用(位置参数在前》关键字参数在后 = 总场数的个数)

2.2.4 默认参数

def func(n1, n2, n3=9):
    print(n1, n2, n3)


func(1, n2=5)

2.2.5 万能参数(打散)

# 接受到的是元组,不支持关键字传参,只能位置传参
def func(*args):
    print(args)


func(1, 2)
func(*(1, 2, 3, 4, 5))  # (1, 2, 3, 4, 5)
func((1, 2, 3, 4, 5))  # ((1, 2, 3, 4, 5),)


# 接受到的是字典,只能关键字传参
def func(**kwargs):
    print(kwargs)


func(a=1)  # {'a': 1}
func(a=1, b=2)  # {'a': 1, 'b': 2}


# 多种形式
def func(a1, a2, *args, **kwargs):
    print(a1, a2, args, kwargs)


func(1, 2, 3, 4, c=6)  # 1 2 (3, 4) {'c': 6}
func(1, 2, *[4, 5, 6], **{'a': 7, 'b': 8})  # 1 2 (4, 5, 6) {'a': 7, 'b': 8}

参数相关重点

# 1.定义函数
def func(a1, a2):
    pass


def func(a1, a2=None):
    pass


def func(*args, **kwargs):
    pass

# 2.调用函数
# 位置参数 》 关键字参数

2.3 作用域

  • 全局作用域
  • 局部作用域
  • 一个函数是一个作用域
  • 作用域查找规则:优先在自己的作用域,自己没有去父级找,直到全局,全局没有就报错
  • 子作用域只能找到父级中的值,默认不能对父级变量重新赋值

name = [1, 2, 3]


def func():
    name.append(4)
    print(name)
  • 如果想赋值,需要使用global关键字,只改全局的
name = [1, 2, 3]


def func():
    global name
    name = 8
    print(name)
  • nonlocal,只改父级的
name = [1, 2, 3]


def func():
    name = 9

    def chg():
        nonlocal name
        name = 10
        print(name)

    chg()
    print(name)


print(name)
  • 全局变量,全部大写

2.4 函数的小高级

a = 123
name = 'breeze'
nums = [1, 2, 3, 4]


def func():
    pass
# func = 函数

2.4.1 函数的赋值

def func():
    print(123)


v1 = func
v1()
func()
func_list = [func, func]
func_set = {func, func}
func_dict = {'k1': func, func: 6}

func_list = [func(), func(), func()]  # [None, None, None]

2.4.2 函数可以当参数进行传递

def func(arg):
    print(arg())


def show():
    print(666)


func(show)
# 666
# None

2.5 lambda 表达式

# 三元运算 ,解决简单的if else
# lambda 表达式,解决简单的函数
func = lambda a1, a2: a1 + a2
func1 = lambda: 100
func2 = lambda *args, **kwargs: len(args) + len(kwargs)
func3 = lambda n1, n2: n1 if n1 > n2 else n2

# list的方法基本都返回None
# 字符串的所有方法都返回新的值
user_list = []
func4 = lambda x: user_list.append(x)
res = func4(4)
print(res)

func_list=[lambda x:x.strip(),lambda x:x.strip()]

2.6 内置函数

img_6.png
  • 输入输出

    • print
    • input
  • 其他

    • len
    • range
    • open
    • id
    • type
  • 强制转换

    • list
    • tuple
    • dict
    • int
    • str
    • set
    • bool
  • 数学相关

    • abs
    • float
    • max
    • min
    • sum
    • divmod 求2个数的商和余数
    • pow pow(2,3)/8
    • round round(3.16323,1) 3.2
  • 进制转换相关
    • bin 0b
    • oct 0o
    • int
    • hex 0x

补充


img_9.png img_10.png

2.7 函数中高级

2.7.1 函数可以作为返回值

img_11.png

注意:函数在何时被谁创建

2.7.2 闭包

img_12.png

2.7.3 高阶函数

  • 对函数进行赋值
  • 把函数当做参数传递
  • 把函数当做返回值

2.7.4 总结

  • 函数执行流程分析
  • 闭包概念:为函数创建一块区域并为其维护自己的数据,以后执行时方便调用(封装值+内层函数调用)
    • 应用场景:装饰器/SQLAIchemy源码

2.8 内置函数

  • 编码相关
    • chr 将十进制数字转换成Unicode编码中对应的字符串
    • ord 根据字符在Unicode编码中找到其对应的十进制
import random
v=random.randint(1,3)
print(chr(v))

data=[]
for i in range(6):
  v=random.randint(65,91)
  data.append(chr(v))
print(''.join(data))

  • 高级一点的内置函数

    • map
    • filter
    • reduce
  • 匿名函数 lambda

2.9 模块

  • 将指定的字符串进行加密
import hashlib
import getpass

USER_LIST = []


def get_md5(data):
    # 加盐
    obj = hashlib.md5('helloworld'.encode('utf-8'))
    obj.update(data.encode('utf-8'))
    res = obj.hexdigest()
    print(res)
    return res


def register():
    while True:
        user = input('请输入用户名:')
        if user.upper() == 'N':
            return
        pwd = input('请输入密码:')
        temp = {'username': user, 'password': get_md5(pwd)}
        USER_LIST.append(temp)


def login():
    print('开始登录')
    user= input('请输入用户名:')
    pwd =input('请输入密码')
    # pwd =getpass.getpass('请输入密码')

    for item in USER_LIST:
        if item['username'] == user and item['password'] == get_md5(pwd):
            return True

register()
print(USER_LIST)
res = login()
if res:
    print('success')
else:
    print('fail')

  • sys


    img_13.png
import sys
import time
import os
# \r 回到当前行的起始位置
# print('123\r',end='')
# print('456',end='')
#
# for i in range(100):
#     msg="{}%".format(i)
#
#     print(msg,end='\r')
#     time.sleep(0.1)

#读取文件的大小(字节)
file_size=os.stat('测试压缩.zip').st_size
print(file_size)
# 一点一点读文件
chunk_size = 64
read_size = 0
with open('测试压缩.zip','rb') as f1:
    while read_size<file_size:
        chunk =f1.read(chunk_size)
        read_size+=len(chunk)
        val=int(read_size/file_size *100)
        print('{}%'.format(val),end='\r')
        time.sleep(0.1)

import sys
import time
import os
import shutil

#删除文件的脚本
print(sys.argv)
shutil.rmtree()

  • os
import os
import shutil

# os.path.exists()
# os.stat()
# os.path.abspath()
# os.path.dirname()
# os.path.join()
#
# res=os.listdir('./hello')
# print(res)

res=os.walk('hello')
for a,b,c in res:
    #a.正在查看的目录,b此目录下的文件夹,c此目录下的文件
    # print(a,b,c)
    for item in c:
        path=os.path.join(a,item)
        print(path)
  • shutil
import shutil

shutil.rmtree()
shutil.make_arch

2.10 装饰器

在不改变原函数内部代码的基础上,在函数执行之前和之后自动执行某个功能


# 装饰器
def func(arg):
    def inner():
        print('start')
        v=arg()
        print('end')
        return v
    return inner

def index():
    print(123)
    return 666

index=func(index)
index()
########################

def func(arg):
    def inner():
        print('start')
        v=arg()
        print('end')
        return v
    return inner

# 第一步:执行func函数并将下面的函数参数传递,相当于func(index)
# 第二步:将func的返回值重新赋值给下面的函数名 index=func(index)
@func
def index():
    print(123)
    return 666

res=index()
print(res)

# 带参数的装饰器
# 第一步:执行wrapper =x(9)
# 第二步:data = wrapper(index)
# 第三步:index = data
def x(counter):
    def wrapper(func):
        def inner(*args,**kwargs):
            print('start')
            v = []
            for i in range(counter):
                data = func(*args,**kwargs)
                v.append(data)
            print('end')
            return v
        return inner
    return wrapper
        
@x(9)                                                                                                                                                      
def index():
    print(123)
    return 666

res=index()
print(res)

总结

  • 编写装饰器
def x(func):
    def y():
        ret =func()
        return ret
    return y

@x
def index():
    pass


  • 应用场景

想要为函数扩展功能时,可以选择装饰器

  • 记住
# 编写格式
def 外层函数(参数):
    def 内层函数(*args, **kwargs):
        return 参数(*args, **kwargs)
    return 内层函数

# 装饰器应用格式
@ 外层函数
def index():
    pass

# 为什么要加*args, **kwargs

2.11 推导式

  • 列表推导式
vals = [i for i in range(10) if i > 5]
  • 集合推导式
vals = {i for i in range(10)}
  • 字典推导式
vals = {'k'+str(i):i for i in range(10)}

面试题

import functools

num1 = 0
num2 = 1
count = 0
while num2 < 400:
    num1,num2 = num2,num1+num2
    count += 1
    print(num1,count)


for i in range(1,1001):
    if sum([j for j in range(1,i) if i%j==0]) == i == functools.reduce(lambda x,y:x*y,[j for j in range(1,i) if i%j==0]) :
        print(i)

2.12 内置模块

2.12.1 os

  • os.mkdir
  • os.makedirs
  • os.path.join
  • os.path.dirname
  • os.path.abspath
  • os.path.exists
  • os.stat
  • os.listdir
  • os.walk
  • os.rename

2.12.2 sys

  • sys.argv
  • sys.getrefcount是解释器相关的数据,递归次数/引用次数
  • sys.path 默认python去导入模块时,会按照sys。path中的路径挨个查找
  • sys.path.append(r'D:')

2.12.3 json

json是一种特殊的字符串,序列化成json

json外层必须是列表或字典

json中字符串必须是双引号

import json

v=[1,2,3,{'k1':'v1'},True,'HELLO',[4,5,6],None]
#序列化
v1=json.dumps(v)
print(v1)

v2='[1, 2, 3, {"k1": "v1"}, true, "HELLO", [4, 5, 6],null]'
print(type(v2))
#反序列化
v3=json.loads(v2)
print(v3)

import json

v={'k1':'breeze','k2':'多少'}
val =json.dumps(v,ensure_ascii=False)
print(val)


with open('testjson.josn','w') as file_object:
    json.dump(v,file_object,ensure_ascii=False)

2.12.4 pickle

  • json 所有语言通用
  • pickle python中所有的东西都能被序列化。 序列化的内容只有python认识
import pickle
v={"k1": "breeze", "k2": "多少"}
val=pickle.dumps(v)
print(val)
data= pickle.loads(val)
print(data)

2.12.5 shutil

  • shutil.rmtree()
  • shutil.move('yuan','new')
  • shutil.make_archive('new','zip','path')
  • shutil.unpack_archive('new',extract_dir='path',format='zip')
  • shutil.copy('gp.csv','hello1.csv')
from datetime import datetime
import shutil
import os
# ctime =datetime.now().strftime('%Y-%m-%d %H-%M-%S')
# print(ctime)
# shutil.make_archive(ctime,'zip','H:\\pyspace\\learn\\note\压缩\\')

# shutil.rmtree('2021-04-13 14-29-00.zip')
# os.remove('2021-04-13 14-29-00.zip')
# os.rmdir(r'H:\pyspace\learn\note\hello\777') #不是空的,不能删除
shutil.rmtree(r'H:\pyspace\learn\note')

2.15.6 time & datetime

1.time 模块

UTC/GMT:世界时间

本地时间:本地时区时间

  • time.time(),时间戳:1970-1-1 00:00
  • time.sleep()
  • time.timezone #-28800

2.datetime

from datetime import datetime,timezone,timedelta
import time

v1=datetime.now()
print(v1)


v2=datetime.utcnow()
print(v2)

#当前东7区时间
tz=timezone(timedelta(hours=7))
v3=datetime.now(tz)
print(v3)

# 将datetime时间转换成字符串
fmt='%Y-%m-%d %H:%M:%S'
print(v1.strftime(fmt))

#字符串转datetime
tm='2021-04-13 15:14:34'
v4 = datetime.strptime(tm,fmt)
print(v4)

# 时间的加减
v5=v4+timedelta(days=1)
print(v5)

# 时间戳和datetime的关系

ctime= time.time()
print(ctime)
v6=datetime.fromtimestamp(ctime,tz=tz)
print(v6)

# datetime转时间戳
v7=datetime.timestamp(v6)
print(v7)

2.15.7 异常处理

import requests

def func(url_list):
    result=[]
    for url in url_list:
        try:
            response = result.get(url)
            result.append(response.text)
        except Exception as e:
            pass
    return result


3 迭代器

3.1迭代器

帮助你对某种对象中的元素进行逐一获取,表象:具有next(),且每次调用都获取可迭代对象中的元素,从前到后一个一个获取。

  • 列表转换成迭代器 v1=iter([1,2,3])/ v1=[1,2,3].iter()
v1=[1,2,3,4,5]
v1.__iter__()
v2=iter(v1)
print(type(v2))
print(v2.__next__())

print(next(v2))

  • 如何判断是否是迭代器,看内部是否有next()方法

3.2 可迭代对象

  • 内部有iter()方法 且返回一个迭代器(生成器)
  • 可以for循环

4 生成器(函数的变异)

#生成器函数,内部是否包含yield
def func(arg):
    arg=arg+1
    print('a')
    print('a')
    print('a')
    yield 1
    print('b')
    yield 2
    print('c')

#函数内部代码不会执行,返回一个生成器对象
v1=func(2)

# 生成器可以被for循环,开始循环那么函数内部代码就会开始执行
for item in v1:
    print(item)

def func():
    count=1
    while True:
        yield count
        count+=1

val=func()

for item in val:
    print(item)


def base():
    yield 88
    yield 99

def func():
    yield 1
    yield 2
    yield from base()
    yield 3

res = func()

for item in res:
    print(item)
    
    
def func():
    for i in range(10):
        def f():
            return i
        yield f


v1=func()
for item in v1:
    print(item())
img_15.png
  • 其他知识
    • yield from
    • 生成器推导式
v1=(i for i in range(10))
print(v1)

  • 生成器也是一种特殊的迭代器,也是一种特殊的可迭代对象


    img_17.png
img_16.png

相关文章

  • 9 函数

    1. 函数的介绍 函数相当于OC中的方法 函数的格式如下 func是关键字,多个参数列表之间可以用逗号(,)分隔,...

  • (9) 函数

    函数 1. 定义 普通函数 函数表达式 Function关键字 箭头函数(ES6) 2. 函数特性 模拟函数重载f...

  • 9 函数

    1 三元运算 2 函数 2.1 函数的基本结构 2.2 参数 2.2.1 基本参数知识 任意个数 任意类型 2.2...

  • Python练习3

    用函数实现9*9乘法口诀

  • typescript 函数

    日期: 2019 年 9 月 3 日 typescript 函数 具名函数与匿名函数 和JavaScript一样,...

  • 9总 函数

    复习: 1.函数就是对实现某一特定功能的代码块的封装 2.函数的声明:def 函数名(新参列表):函数的说明文档函...

  • 9作 函数

    1.写一个函数将一个指定的列表中的元素逆序(例[1,2,3]-->[3,2,1])(注意:不要适用列表自带的逆序函...

  • 9、MySQL函数

    MySQL中提供了许多内置函数,例如: 1、自定义函数 2、删除函数 3、执行函数

  • 函数9:strip

    把多余内容裁剪掉字符串.strip() 无参数为裁剪掉空格

  • 9、内置函数

    (1)内置函数 abs绝对值 cmp比较 range(start, stop[, step]):创建整数列表sta...

网友评论

      本文标题:9 函数

      本文链接:https://www.haomeiwen.com/subject/mlzurltx.html