python,day07笔记

今日内容详细

函数

函数的作用

简单的理解函数的概念,就是你编写了一些语句,为了方便使用这些语句,把这些语句组合在一起,给它起一个名字。使用的时候只要调用这个名字,就可以实现语句组的功能了,函数是可以实现一些特定功能的小方法或是小程序。在Python中有很多内建函数,当然随着学习的深入,你也可以学会创建对自己有用的函数
# 函数相对于是工具,能够提前准备好之后后续可以反复的使用,无需重复制造,即可大大的减少我们的工作时间提升效率
'''在python中函数必须要先定义(创造),之后才能使用'''
# 基于我们之前的知识,每当需要获取用户的用户名和密码都需要重复的写代码
# username = input('username>>>:')
# password = input('password>>>:')

# 函数的定义
'''
********************************************
1.函数在定义阶段只检测语法不执行代码
********************************************
'''
def get_user():
    username = input('username>>>:')
    password = input('password>>>:')
    print('%s:%s'%(username,password))
# 2.函数的调用
'''
*********************************************
函数名+括号
    会执行函数体内部的代码
*********************************************
'''
get_user()

函数的语法结构

# 函数的语法结构
"""
def get_user():
    '''函数的注释'''
    username = input('username>>>:')
    password = input('password>>>:')
    print('%s:%s'%(username,password))
    return 返回值

1.def  是定义函数的关键字
2.get_user  是函数名(类似于变量名 起的时候尽量做到见名知意)
3.(参数1,参数2)   括号里面可以放参数,意思是在调用函数的时候可以给函数内部传递额外的数据
4.参数    外界传递给函数内部的数据(不是必需的)
5.函数的注释     用来解释该函数的功能、使用方式、注意事项
6.函数体代码     函数真正的功能逻辑
7.return        函数执行完毕之后返回给调用者的信息(该关键字也不是必需的)

def 函数名(参数1,参数2,...):
    '''函数的注释'''
    函数体代码
    return 返回值
"""

函数的分类

# 1.无参函数:定义函数的时候括号内没有参数
def index():  
    print('from index')

# 2.有参函数:定义函数的时候括号里面有参数,那么在调用该函数的时候也必须传参数
def index(x,y):
    print(x,y)
    
# 3.空函数:没有具体的函数体代码
def index():
    pass
"""
空函数多用于做前期的项目架构(空函数列举全部的功能之后再填充函数体代码)
eg:贾维斯功能开发
函数不单单可以理解为是工具还可以看成是具有一定功能的功能
"""
def talk():
    pass
def run():
    pass
def fight():
    pass
def read():
    pass
注意函数代码块以def关键词开头,后接函数标识符名称和圆括号(),任何传入参数和自变量必须放在圆括号中间

函数的返回值

def index():
    print('from index')
    return 123
# 1.函数体代码中没有return关键字的时候
# res = index()  # 将index执行之后的返回值(结果)赋值给res
# print(res)  # None
'''没有return关键字函数默认返回None'''

# 2.函数体代码中有return关键字的时候(后面没有值)
# res = index()  # 将index执行之后的返回值(结果)赋值给res
# print(res)  # None
'''有return关键字但是后面没有值照样返回None'''

# 3.函数体代码中有return关键字的时候(后面有单个值)
# res = index()  # 将index执行之后的返回值(结果)赋值给res
# print(res)  # 666
'''return后面写什么函数就会返回什么'''

# 4.函数体代码中有return关键字的时候(后面有多个值)
# res = index()  # 将index执行之后的返回值(结果)赋值给res
# print(res)  # (123, 333, 333, 444, 555)
'''return后面写多个值 默认会自动组织成元祖的形式返回'''

"""
return除了有返回值功能之外,还有一个功能就是立刻结束函数的运行
大白话:当函数体代码遇到return会立刻结束
"""

函数的参数概念

形式参数
	在函数的定义阶段,括号内写的参数都叫形式参数(类似于变量名)
    	可以简称为"形参"
实际参数
	在函数的调用阶段,括号内传的参数都叫实际参数(类似于变量的值)
    	可以简称为"实参"
        
形式参数与实际参数之间的联系
	在函数调用阶段括号内传入的实际参数会复制给形式参数
    当函数运行结束之后两者又会解开关系
    def index(x,y):
        print(x,y)
    index(1,2)  # x = 1  y = 2

函数的参数

# 位置参数
# def index(x,y):
#     print(x,y)
# index(111)  # 给少了不行
# index(111,222)  # 111 222  # 要几个就给几个
# index(111,222,333)  # 给多了也不行
'''
按照位置的先后顺序传值
'''

# 关键字参数
# def index(x,y,z):
#     print(x,y,z)
# index(y=111,x=222)
# index(y=111,222)  # 报错
# index(222,z=666,y=111)  # 符合
# index(222,x=666,y=111,z=222)  # 形式参数在传实际参数的时候不能给多个
'''
指名道姓的给形式参数传值 可以打破位置的限制

注意事项
    1.关键字参数必须在位置参数的后面
    2.形式参数在传实际参数的时候不能给多个

补充
    函数我们有时候也称之为方法
'''


# res = 'my name is {}'.format('jason')
# res1 = 'my name is {0}'.format('jason')
# res2 = 'my name is {name}'.format(name='jason')


# 默认参数
# def register(username, gender='male'):
#     print('姓名:%s,性别:%s' % (username, gender))
# # register('jason', 'male')
# # register('egon', 'male')
# # register('kevin', 'male')
# # register('queen', 'female')
# register('jason')
# register('kevin')
# register('egon')
# register('queen','female')
'''
在函数定义阶段就已经给形式参数赋值了
    当用户不给数据的时候就用默认的
    当用户给了数据的时候就用用户的
'''

# 可变长参数
# def index(x,*y):
#     print('from index')
#     print('x:',x)
#     print('y:',y)
# 无论传多少个位置参数函数都可以正常执行
# index(1,2,2,2,2,2,2,3,4,4,5,6,7,6,4,5,67,5,4,5,6,5)

# def index(x,**y):
#     print('from index')
#     print('x:',x)
#     print('y:',y)
# # 无论传多少个关键参数函数都可以正常执行
# index(1,y=2,z=3,u=1)
'''
*
    在形式参数中,用于接收多余的位置参数
    组织成元祖的形式赋值给*后面的变量名
**
    在形式参数中,用于接收多余的关键字参数
    组织成字典的形式赋值给**后面的变量名
'''
# 定义一个函数无论传多少个位置参数和关键字参数都能够正常执行
# def index(*a,**b):
#     print('a:',a)
#     print('b:',b)
#
# index()
# index(111,222,2,2,2,2,23,3,4,5)
# index(a=1,b=2,c=2)
# index(111,222,33,a=1,d=2)
'''
由于我们以后再写函数的时候不知道该函数将来可能会接收什么参数
所以我们在定义函数的时候一般情况下都是用*和**
并且由于使用频率较高 两个符号后面的变量名我们统一使用下面两个
    args
    kwargs
'''
def index(*args,**kwargs):
    pass

默认参数一定要用不可变对象,如果是可变对象,运行会有逻辑错误!
# 补充
# *和**不单单可以在形式参数中使用还可以在实际参数中使用
l = [111,22,33,44,55,]
d = {'a':111,'b':222,'c':333}
# def index1(*a):
#     print(a)
# index1(l)  # ([111, 22, 33, 44, 55],)
# index1(*l)  # (111, 22, 33, 44, 55)
# 等价
# index1(111,22,33,44,55)  # (111, 22, 33, 44, 55)

def index2(*args,**kwargs):
    print(args)
    print(kwargs)
index2(d)  # ({'a': 111, 'b': 222, 'c': 333},)
index2(**d)  # {'a': 111, 'b': 222, 'c': 333}
# 等价
index2(a=111,b=222,c=333)  # {'a': 111, 'b': 222, 'c': 333}
'''
*
    在实际参数中会将列表中的元素打散成位置参数的形式
    挨个传入函数

**
    在实际参数中会将字典的k:v键值对打散成关键字参数
    挨个传入函数
'''

函数小练习

# 注册登录功能
'''体会编程魅力'''
def get_user():
    username = input('username>>>:').strip()
    password = input('password>>>:').strip()
    return username, password


def register():
    # 解压赋值
    user, pwd = get_user()
    # 将数据存入文件
    with open(r'userinfo.txt', 'a', encoding='utf-8') as f:
        f.write('%s:%s\n' % (user, pwd))


def login():
    user, pwd = get_user()
    with open(r'userinfo.txt', 'r', encoding='utf-8') as f:
        for line in f:
            # print(line)  # jason:123
            # 字符串的切割
            name,password = line.strip('\n').split(':')
            if user == name and password == pwd:
                print('登录成功')
                break       # 直接结束for循环
        else:
            print('用户名或密码错误/用户不存在')


# 注册
# register()
# 登录
login()

模块

模块你可以看成是已经写好的具有一定功能的代码块
模块的范围比函数广,在模块中,可以有多个函数,模块你可以看成是已经写好的具有一定功能的代码块
模块的表现形式可以是单个的py文件,也可以是多个py文件组成的文件夹

为什么需要模块呢?

最大的好处是大大提高了代码的可维护性。其次,编写代码不必从零开始。当一个模块编写完毕,就可以被其他地方引用。我们在编写程序的时候,也经常引用其他模块,包括 Python 内置的模块和来自第三方的模块用模块还可以避免函数名和变量名冲突。相同名字的函数和变量完全可以分别存在不同的模块中,因此,我们自己在编写模块时,不必考虑名字会与其他模块冲突。但是也要注意,尽量不要与内置函数名字冲突

前戏
	python刚开始出来的时候,不被其他语言的使用者看好,
    甚至还嘲笑python是调包侠
    调包侠:
        自己写的代码很少,基本都是调用别人写好的代码
        改动改动就可以了
    当他们在使用完python之后,发现了"真香定律"
    原本可能需要一个月的工作用python只需要一个星期
   
如何调包
	1.可以是自己写的
    2.也可以是内部自带
    3.第三方(别人写的)

    
使用方式
	1.内置的(python解释器自带的)
    	import os
    2.自己写的
        import mydd  # 将mydd内所有的变量全部导入
        from mydd import name  # 从mydd中只导入一个name变量
    """
    导入模块其实会自动执行模块文件内的所有代码
    之后通过模块名的形式就可以直接使用模块内所有的功能
    """
    3.导入第三方(存于网上)
    	要想第三方模块必须先下载
        pip3 
        pip3 install requests  # 默认是去国外的仓库下载 速度会比较慢
        # 针对下载地址我们可以有以下几种方式修改
        (1)阿里云 http://mirrors.aliyun.com/pypi/simple/
        (2)豆瓣http://pypi.douban.com/simple/
        (3)清华大学 https://pypi.tuna.tsinghua.edu.cn/simple/
        (4)中国科学技术大学 http://pypi.mirrors.ustc.edu.cn/simple/
        (5)华中科技大学http://pypi.hustunique.com/
            
        # 方式1 
        pip3 install -i https://pypi.tuna.tsinghua.edu.cn/simple/ requests
        # 方式2
        pycharm快捷方式修改
        # 方式3(修改python的配置文件)
        不建议修改
     

模块的使用

import random

# 内置的 随机模块
# print(random.random())  # 0-1之间的随机小数
# print(random.randint(1,6))  # 1-6之间的整数  类似于摇骰子
# l = [2, 3, 4, 5, 6, 7, 8, 9, 10, 'J', 'Q', 'K', 'A']
# random.shuffle(l)  # 洗牌功能  打乱原来的顺序
# print(l)
l1 = ['三等奖','二等奖','一等奖','谢谢惠顾','如花抱回家']
res = random.choice(l1)  # 随机抽取
print(res)
上一篇:名称空间与作用域


下一篇:Python入门day15——名称空间及作用域