函数


import random
import base64
import pyperclip
import sys

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

    函数能提高应用的模块性,和代码的重复利用率。

    函数的作用:-合并重复-测试方便-修改方便-打包-映射

    函数(function),最早由中国清朝数学家李善兰翻译,出于其著作《代数学》。之所以这么翻译,他给出的原因是“凡此变数中函彼变

    数者,则此为彼之函数”,也即函数指一个量随着另一个量的变化而变化,或者说一个量中包含另一个量。函数的定义通常分为传统定义

    和近代定义,函数的两个定义本质是相同的,只是叙述概念的出发点不同,传统定义是从运动变化的观点出发,而近代定义是从集合、映

    函数的定义:

    def	->	关键词,不可变!

    s	->	parameters,参数,可以有多个,用逗号分隔

    function_name	->	函数名,小写字母,下划线连接单词

    statement(s)	->	代码语句,或其他函数,带(s)为调用,call

    函数的作用域:L (Local) 局部作用域
                E (Enclosing) 闭包函数外的函数中
                G (Global) 全局作用域
                B (Built-in) 内建作用域

    以 L –> E –> G –>B 的规则查找,即:在局部找不到,便会去局部外的局部找(例如闭包),再找不到就会去全局找,再者去内建中找。

"""

""" 演示 生成两个随机数"""


def rand_num():
    print(random.randint(1, 10))
    print(random.randint(1, 10))

rand_num()

""" 返回一个随机数 """


def rand_num1():
    return random.randint(1, 10)

print(rand_num1())

""" 指定随机数范围 """


def rand_num2(start, end):
    print(random.randint(start, end))

rand_num2(1, 10)

""" 
    - 函数的几种参数
    - 1默认参数 需要放在不带默认值参数的后面

"""


def rand_num3(start, end=10):
    print(random.randint(start, end))

rand_num3(1)


def rand_num4(start, end=10, n=5):
    return [random.randint(start, end) for _ in range(n)]

print(rand_num4(1))


def fun(a, l=[]):  # 默认值只计算一次 列表内容会累计
    l.append(a)
    return l

print(fun(3))
print(fun(5))


def fun1(a, l=None):
    l = []
    l.append(a)
    return l

print(fun1(3))
print(fun1(2))


""" 关键词参数 """


def user_info(name, id=1, thing='homework', time='2018-6-11'):
    print(f'{name},{id},{thing},{time}')

user_info('dongli')  # 按位置传给不带默认值的参数, 必须传参

user_info('dongli', 10, 'play rongyao', '2018-6-11')  # 按位置传参

user_info('dongli', thing='play women!')  # 按键传参


""" 传递任意参数 """


def user(*args, **kw):  # *代表tuple ** 代表dict
    print(*args, *kw)


user(('dongli', 'jiamei'), {'ralation': 'good friend'})
user({'age': {18: 19}})


def user1(name='dongli', *,  age):  # 必须传递参数 传参是用 = 号
    print(name, age)

user1(age=18)


"""匿名 函数 Lambda """

l = lambda x: x+1

print(l(1))

ls = [1, 2, 3, 4, 5]

ls = list(map(lambda x: x*1100, ls))

print(ls)

f = list(filter(lambda x: x > 3000, ls))

print(f)


""" 函数注释 """


def fun2(x: int) -> int:
    """测试函数"""
    return 3

print(fun2.__doc__)
print(fun2.__annotations__)


def fun3():
    pass  # pass占位置

""" 作用域 """

# n = 1  # 全局


# def add():
#     n += 1  # 局部
#     print(n)

# add()

x = 99


def add1():
    print(x)  # 直接使用全局

add1()


ls1 = [1, 2, 3]


def add_ls(num):
    ls2 = ls1  # 浅拷贝
    ls2.append(num)

add_ls(4)
print(ls1)

"""
    函数的嵌套

    函数是Python里面的一级对象,可以用在任何地方,比如函数里面,这时候的作用域属于封闭作用域。

    一级对象:

        在运行时创建
        能赋值给变量或数据结构
        能作为参数传给函数
        能作为函数的返回结果
"""


def calc(x, y):

    def add():
        print(x+y)
    add()

calc(1, 2)

""" 闭包 """


def f():
    x = 1

    def n():
        nonlocal x
        x = x+1
        print(x)
    return n

f1 = f()
f1()
f1()

""" 案例 密码生成器 """


def custom_pwd(origin_pwd, salt='de8ug', count=8, offset=3): 
    print('before salt:', origin_pwd)

    new_pwd = base64.b64encode((origin_pwd + salt).encode('utf-8')) 
    new_pwd = new_pwd.decode('utf-8')

    print('after salt:', new_pwd) 
    if len(new_pwd) < count:
        new_pwd = new_pwd.ljust(count, 'a')

    pyperclip.copy(new_pwd[offset: count + offset]) 
    return 'ok, 找地方粘贴密码去吧!'


print('生成密码:', custom_pwd('sdfsda'))

最后更新于:2018-06-11 21:48:54