函数(参数,返回值,主函数,全局变量和局部变量,内部函数,文件的操作)


一.参数

  • 形式参数与实际参数

  1. 定义:形式函数内部定义用的参数,实际参数是在调用函数的时候的参数,
  2. 在函数里面,实际参数会被赋值给形式参数
    def func(username,password):   #"username"和"password"是函数func的形式参数
        if username=="tang" and password==123456:
            print("登录成功")
        else:
            print("账号密码错误")
    func("tang",123456)    #"tang"和123456是实际参数,会被赋值给形式参数
    func(username="tang",password=123456)

    输出:登录成功
  3. 函数的形式函数,实际参数的值也可以是函数
    def login(username="tang",password=123):
        if username=="tang" and password==123:
            return "correct"
        else:
            return "error"
    def profile(a):
        if a=="correct":
            print("欢迎访问主页")
        else:
            print("登录失败")
    profile(a=login())
  4. def login(username="tang",password=123):
        if username=="tang" and password==123:
            return "correct"
        else:
            return "error"
    def profile(a=login()):
        if a=="correct":
            print("欢迎访问主页")
        else:
            print("登录失败")
    profile()
  • 默认参数

  1. 定义:在定义函数的时候,给函数的形式参数指定它的默认值
    def func(username="tang",password=123456   #默认参数
    ):
        if username=="tang" and password==123456:
            print("登录成功")
        else:
            print("账号密码错误")
    func()

    输出:登录成功
  2. 调用函数的时候,实际参数的优先级是高于默认参数的
    def func(username="tang",password=123456):
        if username=="tang" and password==123456:
            print("登录成功")
        else:
            print("账号密码错误")
    func(username="tang",password=1234)

    输出:账号密码错误
  • 动态参数

  1. 用途:
    1.当定义的函数心事参数的个数不确定的时候
    2.定义的函数形式参数的数据类型不确定的时候
  2. 参数前一个“*”:在函数中会把传的参数转成一个元组。
    def func(*args):
        print(args)
        print(type(args))
    func("python",2,3)

     输出:

    ('python', 2, 3)
    <class 'tuple'>
  3. 参数前两个个“*”:在函数中会把传的参数转成一个字典。
    def func(**kwargs):
        print(kwargs)
        print(type(kwargs))
    func(a="python",b=12)

     输出:

    {'a': 'python', 'b': 12}
    <class 'dict'>
  4. 当我们调用被定义动态参数的函数的时候,实际参数如果存在key=value的情况,基本是字典的数据类型,其他的都是元组的数据类型
  5. 动态参数能解决什么?当一个接口请求参数有时候是2个,有时候是3个或N个,如果按照正常的思维,我们需要编写N个函数,有了动态参数之后,我们只需要编写一个函数就可以了

二.返回值

  1. 当一个函数里面,有return,那么函数的返回值就是return后面的值
    def func(a=1,b=2):
        if a==1 and b==2:
            return "正确"
        else:
            return "错误"
    
    print(func())

     输出:正确

  2. 当一个函数里面,没有return,那么函数的返回值是None
    def func(a=1,b=2):
        if a==1 and b==2:
            print("正确")
        else:
            return "错误"

     输出:

    正确
    None
  3. 一个函数可以有多个返回值
    def func(a=2):
        y1=a+3
        y2=a+6
        return y1,y2
    print(func())

     输出:

    (5, 8)
  4. 返回值的价值:如果在单个的函数角度而言,函数其实有没有返回值无所谓的,但是函数与函数之间需要建立一层关联关系,那么就可以通过函数的返回值把这层关联关系建立起来。
    def login(username="tang",password=123):
        if username=="tang" and password==123:
            return "correct"
        else:
            return "error"
    def profile():
        if login()=="correct":
            print("欢迎访问主页")
        else:
            print("登录失败")
    profile()
    输出:“欢迎访问主页”

三.主函数main

if __name__ == '__main__':
    profile()
  1. 设置主函数的目的:指定程序执行的入口
  2. 在其他编程语言中,执行的代码必须在主函数里面才可以执行,其他的不可以执行,但是python中都可以执行

四.全局变量跟局部变量

  • 全局变量:定义的变量作用域是这个Python文件

    name="asd"   #全局变量
  • 局部变量:在函数内部定义的变量,作用域值针对这个函数

    def func():   #定义函数
        name="admin"   #局部变量
        print(name)
  • 当全局变量和局部变量的变量名称一致时:

    1. 在函数内部,局部变量的优先级是高于全局变量的
  1. 在Python文件中,全局变量的优先级是高于局部变量的
    name="asd"   #全局变量
    def func():   #定义函数
        name="admin"   #局部变量
        print(name)
    func()   #调用函数
    print(name)   #输出变量name

     输出:

    admin
    asd
  • global:在函数内部调用全局变量

    name="asd"
    def func():
        global name
        name="tang"
        print(name)
    func()

五.内部函数

lambda:匿名函数

a=lambda x,y:x+y
print(a(2,3))

filter:过滤函数

    • 如果我们按照之前的方法把list1大于3的值添加到list2中
      list1=[x for x in range(10)]
      list2=[]
      for item in list1:
          if item>3:
              list2.append(item)
      print(list2)
    • 使用函数和过滤函数添加
      list1=[x for x in range(10)]
      def func(a):
          if a>3:
              return True
      print(list(filter(func,list1)))
    • 使用过滤函数和匿名函数添加
      list1=[x for x in range(10)]
      print(list(filter(lambda a:a>3,list1)))
      
      print(list(filter(lambda a:a>3,[x for x in range(10)])))

       这些代码输出的值都是:

      [4, 5, 6, 7, 8, 9]

map:对所有的对象进行同样的操作

                     比如我们要对函数"x for x in range(10)"的值都加5

  • 使用for循环的方式实现
    list1=[x for x in range(10)]
    list2=[]
    for item in list1:
        list2.append(item+10)
    print(list2)
  • 使用函数和map函数实现
    list1=[x for x in range(10)]
    def func(a):
        return a+10
    print(list(map(func,list1)))
  • 使用map函数和匿名函数实现
    print(list(map(lambda a:a+10,[x for x in range(10)])))

     以上三种方式的输出都为:

    [10, 11, 12, 13, 14, 15, 16, 17, 18, 19]

eval:字符串转为表达式

str1="20+10"
str2="20*10"
print(eval(str1))
print(eval(str2))

输出:

30
200

range:包含开头不包含结尾的范围

for item in range(4,9):
    print(item)

输出:

4
5
6
7
8

ord:字母转为数字

print(ord("a"))
输出为:97

chr:数字转为字母

print(chr(109))
输出:m

随机生成字符串:random随机数 import导入

import random   #导入库
list1=[]   #定义列表list1
for a in range(4):   #循环展示4次
    r=random.randrange(97,123)   #定义对象r赋值为97-123之间的随机数
    list1.append(chr(r))   #把取到的r值转为字母添加到列表list1中
print(" ".join(list1))   #以空格合并列表list1的值并输出

         random.randrange():从指定范围内,按指定基数递增的集合中获取一个随机数

六.文件的操作

  1. 文件操作使用的函数是open

  2. 文件的操作模式

    1. w:写:open在写文件的时候,首先判断被操作的文件是否存在,如果不存在,就会在内部自动创建一个文件
    2. r:读:open在写文件的时候,首先判断被操作的文件是否存在,如果不存在,就报FileNotFoundError的错误提示信息
  3. 文件的操作步骤

    1. 打开
    2. 操作
    3. 关闭

       如我们要在helloworld.txt的文件中写“世界你好!”的内容,并读取出来

f=open("log.txt","w",encoding="utf-8")
f.write("世界你好!")
f.close()
f1=open("log.txt","r",encoding="utf-8")
print(f1.read())
f1.close()