python学习笔记-函数

函数

  • 代码的一种组织形式
  • 一个函数一般完成一项特定的功能
  • 函数使用
    • 函数需要先定义
    • 使用函数,俗称调用
# 定义一个函数
# 只是定义的话不会执行
# 1、def关键字,后跟一个空格
# 2、函数名,自己定义,起名需要遵循命名规则,约定俗成,不用大驼峰(只给类用)
# 3、后面括号和冒号不能省,括号内可以有参数
# 4、函数内所有代码缩进
def func():
    print("我是一个函数")
    print("我要完成一定功能")
    print("我结束了")

# 函数调用
# 直接函数名后面跟括号
func()

我是一个函数
我要完成一定功能
我结束了

参数的定义和使用

  • 参数:负责给函数传递一些必要的数据或者信息
    • 形参(形式参数):在函数定义的时候用到的参数没有具体值,只是一个占位符号,成为形参
    • 实参(实际参数):在调用函数时输入的值
  • 返回值:函数的执行结果
    • 使用return关键字
    • 如果没有return,默认返回一个None
    • 函数一旦执行return,则无条件结束函数执行
# 参数的定义是使用
# 参数的person只是一个符号,代表队黑色调用的时候的某一个数据
def hello(person):
    print("{0}, 你肿么了".format(person))
    print("sir, 你不理睬额额就走了")
    
p = "明月"
hello(p)
###################################
明月, 你肿么了
sir, 你不理睬额额就走了
# return语句的使用
# 函数打完招呼后返回一句话
def hello(person):
    print("{0}, 你肿么了".format(person))
    print("sir, 你不理睬额额就走了")
    
    return "我已经跟{0}打招呼了,{0}不理我".format(person)

p = "明月"
print(hello(p))
###########################################
明月, 你肿么了
sir, 你不理睬额额就走了
我已经跟明月打招呼了,明月不理我
# return案例2:无条件结束
def hello(person):
    print("{0}, 你肿么了".format(person))
    return "哈哈,我提前结束了"
    print("sir, 你不理睬额额就走了")
    
p = "明月"
print(hello(p))
######################################
明月, 你肿么了
哈哈,我提前结束了
# 查找函数帮助文档
# 1、用help函数
help(print)
############################################
Help on built-in function print in module builtins:

print(...)
    print(value, ..., sep=' ', end='\n', file=sys.stdout, flush=False)
    
    Prints the values to a stream, or to sys.stdout by default.
    Optional keyword arguments:
    file:  a file-like object (stream); defaults to the current sys.stdout.
    sep:   string inserted between values, default a space.
    end:   string appended after the last value, default a newline.
    flush: whether to forcibly flush the stream.
# 九九乘法表
# version 1.0
for row in range(1,10):
    # 打印一行
    for col in range(1,row+1):
        # print函数默认任务打印完毕后换行
        print(row * col, end=" ")
    print("...................................")
#######################################
1 ...................................
2 4 ...................................
3 6 9 ...................................
4 8 12 16 ...................................
5 10 15 20 25 ...................................
6 12 18 24 30 36 ...................................
7 14 21 28 35 42 49 ...................................
8 16 24 32 40 48 56 64 ...................................
9 18 27 36 45 54 63 72 81 ...................................
# 定义一个函数,打印一行
def printLine(row):
    for col in range(1,row+1):
        # print函数默认任务打印完毕后换行
        print(row * col, end="\t")
    print("")

# 九九乘法表
# version 2.0
for row in range(1,10):
    printLine(row)
#######################################
1   
2   4   
3   6   9   
4   8   12  16  
5   10  15  20  25  
6   12  18  24  30  36  
7   14  21  28  35  42  49  
8   16  24  32  40  48  56  64  
9   18  27  36  45  54  63  72  81

参数详解

  • 参考资料
  • python参考资料:headfrist python -> 零基础入门学习python(小甲鱼)-->习题-->后期可以考虑腾讯公开免费课
  • 本讲义参考的是流畅的python
  • 参数分类
    • 普通参数
    • 默认参数
    • 关键字参数
    • 收集参数
  • 普通参数
    • 参见上面实例

    • 定义的时候直接定义变量名

    • 调用的时候直接把变量名或者值放入指定位置

        def 函数名 (参数1,参数2,...):
                函数体
                
        # 调用
        函数名(value1, value2, ...)
        
        # 调用的时候,具体值参考的是位置,按位置赋值
      
  • 默认参数
    • 形参带有默认值

    • 调用的时候,如果没有对相应的形参赋值,则使用默认值
      def funcName(arg1=v1, arg2=v2, ...):
      funcBlock

            # 调用1
            funcName()
            
            # 调用2
            v1 = 100
            v2 = 200
            funcName(v1, v2)
      
  • 关键字参数
    • 语法
      def func(p1=v1, p2=v2, ....):
      funcBlock
      调用函数
      func(p1=v1, p2=v2)
    • 比较麻烦,但也有好处
      • 不同意混淆,一般实参和形参只是按照位置一一对应,容易出错
      • 使用关键字参数,可以不考虑位置
# 关键字
def stu(name, age, addr):
    print("I am a student")
    print("我叫{0},我今年{1}岁了,我住{2}".format(name, age, addr))
    
n = "jingjing"
a = 18
addr = "我家"

# 普通参数,只按照位置传递,容易出错
stu(a, n, addr)

def stuKey(name, age, addr):
    print("I am a student")
    print("我叫{0},我今年{1}岁了,我住{2}".format(name, age, addr))
    
n = "jingjing"
a = 18
addr = "我家"

# 普通参数,只按照位置传递,容易出错
stuKey(age=a, name=n, addr=addr)
############################################################################
I am a student
我叫18,我今年jingjing岁了,我住我家
I am a student
我叫jingjing,我今年18岁了,我住我家

收集参数-不定长参数

  • 把没有位置,不能和定义是的参数位置相对应的参数,放入一个特定的数据结构中

  • 语法
    def func(*args):
    funcBlock
    按照list使用方式访问args得到的传入参数

      使用:
      func(p1,p2,p3,...)
    
  • 参数名args不是必须这么写,但是,我们推荐使用args,约定俗成

  • 参数名args前须要星号---*

  • 收集参数可以和其他参数共存

# 收集参数
# 函数模拟一个学生进行自我介绍,但具体内容不清楚
# args把它看成一个list
def stu(*args):
    print("------------------------------------------")
    print("hello,大家好,我自我介绍下,简单说两句")
    # type函数作用是检测变量的类型
    print(type(args))
    for item in args:
        print(item)

stu("liuying", 18, "北京大通州区", "wangxiaojing", "single")
stu("周大神")
stu()
############################################################################
------------------------------------------
hello,大家好,我自我介绍下,简单说两句

liuying
18
北京大通州区
wangxiaojing
single
------------------------------------------
hello,大家好,我自我介绍下,简单说两句

周大神
------------------------------------------
hello,大家好,我自我介绍下,简单说两句

收集参数之关键字收集参数

  • 把关键字参数按照字典格式存入收集参数

  • 语法
    def func(**kwargs):
    funcBlock

      # 调用
      func(p1=v1, p2-v2,...)
    
  • kwargs 约定俗成的写法

  • 调用的时候,把多余的关键字参数放入kwargs中

  • 访问kwargs需要按字典格式访问

# 关键字收集参数
# 自我介绍
# 调用的时候需要使用关键字调用
def stu(**kwargs):
    print("*" * 50) # 字符串乘法
    print(type(kwargs))
    # 在函数体内对于kwargs的使用不用带星号
    print("Hello,大家好,我先自我介绍一下:")
    # 对于字典的访问,python2.x 跟python3.x有区别
    for k,v in kwargs.items():
        print(k,"---", v)
        print(type(kwargs.items()))
        
stu(name="liuying", age=19, addr="北京大通州区", lover="王晓静", work="Teacher")
stu(name="周大神")
stu()

收集参数混合调用的顺序问题

  • 收集参数,关键字参数,普通参数可以混合使用
  • 使用规则就是,普通参数和关键字参数优先
  • 定义的时候一般找普通参数,收集参数tuple,关键字参数,普通参数dict
# 收集参数混合使用
# stu模拟一个学生的自我介绍
def stu(name, age, *args, hobby="没有", **kwargs):
    print("*" * 50)
    print("Hello,大家好")
    print("我叫{0}, 我今年{1}岁了".format(name, age))
    if hobby == "没有":
        print("我没有爱好,谢谢")
    else:
        print("我的爱好是{0}".format(hobby))
    
    print("**********普通收集参数************************")
    for i in args:
        print(i)
    
    print("**********关键字收集参数************************")
    for k,v in kwargs.items():
        print(k, "---", v)
        
# 开始调用
name = "liuying"
age = 19

# 调用不同格式
#stu(name, age)
#stu(name, age, "游泳")
stu(name, age, "王晓静", "刘石头", hobby="游泳", hobby2="烹饪", hobby3="跟不同女生聊天")

收集参数的解包问题

  • 把参数放入list或者dict中,直接吧list、dict中的值放入手机参数中
  • 语法:看代码
# 收集参数的解包问题
def stu(*args):
    print("*" * 30)
    print("hahaha")
    # 主要用来调试
    n = 0
    for i in args:
        print(type(i))
        print(n)
        n += 1
        print(i)
        
stu("liuying", "liuxiaoying", 19, 200)

l = list()
l.append("liuying")
l.append("liuxiaoying")
l.append(19)
l.append(200)
# 这么写,会将list当成tuple的一个元素,所以for循环时只循环一次
stu(l)
# 如果要循环打印出list中的每一个元素,需要在实参前加上解包符号---*
stu(*l)
############################################################################
******************************
hahaha

0
liuying

1
liuxiaoying

2
19

3
200
******************************
hahaha

0
['liuying', 'liuxiaoying', 19, 200]
******************************
hahaha

0
liuying

1
liuxiaoying

2
19

3
200

同理 dict类型收集参数一样可以解包,但是

  • 对dict类型进行解包
  • 解包符---**

返回值

  • 函数和过程的区别
    • 有无返回值
  • 需要用return返回
  • 如果没有返回,则默认返回None
  • 推荐写法,无论有无返回值,最后都要以return结束

函数文档

  • 函数文档的作用是对当前函数提供使用相关参考信息
  • 文档写法
    • 在函数内部开始的第一行使用三引号字符串定义符
    • 一般具体有特定格式
    • 参看代码
  • 文档查看
    • 使用help函数查看
    • 使用doc,查看代码
# 文档
# 函数stu是模拟一个学生的自我介绍的内容
def stu(name, age, *args):
    '''
    这是文档
    第一行
    第二行
    第三行
    '''
    print("This is func doc")
    
# 查看函数文档
help(stu)
stu.__doc__
############################################################################

Help on function stu in module __main__:

stu(name, age, *args)
    这是文档
    第一行
    第二行
    第三行




Out[50]:

'\n    这是文档\n    第一行\n    第二行\n    第三行\n    '

备注:以上内容均是观看北京图灵学院免费python视频课程摘抄的笔记

你可能感兴趣的:(python学习笔记-函数)