zoukankan      html  css  js  c++  java
  • Python基础第五天:函数初识

    函数初始

    一、什么是函数

      现在有这样一个情况:Python中的len()方法不让用了,你怎么办?

      来测试一下 :'hello world' 的长度:

      s1 = 'hello world'
      length = 0
    
      for i in s1:
         length += 1
    
      print(length)
      11

    OK,完事儿了,非常完美。但是主管又提出一个需求,要求计算两外一个字符串的长度:‘hello china’,于是你的代码就变成这样了:

        s1 = 'hello world'
        length = 0
    
        for i in s1:
            length += 1
    
        print(length)
    
        s2 = 'hello china'
        length = 0
        for i in s2:
            length += 1
    
        print(length)
      11
      11

      这样确实可以实现len()方法的效果,但是总感觉不是那么完美?为什么呢?

      首选,之前只要我们执行len()方法就可以直接拿到一个字符串的长度了,现在为了实现相同的功能我们把相同的代码写了好多遍————代码冗余

      其次,之前我们只写两句话读起来也简单,一看就知道这两句代码是在计算长度,但是刚刚的代码却不是那么容易读懂—————可读性差

      所以,我们就想能不能用一段代码,来实现相同的功能,比如:我们写一个len()方法叫做my_len()方法,可以代替len()的方法,既解决了代码冗余,又让其可读性好,用什么方法?这就引出了我们今天讲的----函数

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

      函数能提高应用的模块性,和代码的重复利用率。你已经知道Python提供了许多内建函数,比如:print(),len()等。但你也可以自己创建函数,这就叫做用户自定义函数

    二、函数的定义与调用

        #函数定义
        def mylen():
            #计算str的长度
            str = "hello world"
            length = 0
            for i in str:
                length += 1
            print(length)
        
        #函数调用
        mylen()
        11

      上面我们写了一个函数,并且成功的调用了它

      定义:def 关键词开头,空格之后接函数名称和圆括号(),最后还有一个":"   
    
      def 是固定的,不能变,他就是定义函数的关键字          
    
      空格 为了将def关键字和函数名分开,必须空(四声),当然你可以空2格、3格或者你想空多少都行,但正常人还是空1格  
    
      函数名:函数名只能包含字符串、下划线和数字且不能以数字开头。虽然函数名可以随便起,但我们给函数起名字还是要尽量简短,并能表达函数功能
    
      括号:是必须加的
    
      注释:每一个函数都应该对功能和参数进行相应的说明,应该写在函数下面第一行。以增强代码的可读性
    
      调用:就是 函数名() 要记得加上括号

    三、函数的返回值

      调用len()方法时,得到的结果会赋值给一个变量,然后的到结果:

      str_len = len('hello world')
      print(str_len)
      11

      但是我们写的mylen()函数,并不会得到这样的结果,如何让他们和len()函数一样,有返回值呢?

      那需要在函数的最后加上一个return,return后面写你需要的放回 值就可以了

      # #函数定义
      def mylen():
          #计算str的长度
          str = "hello world"
          length = 0
          for i in str:
              length += 1
          return length
    
      #函数调用
      mylen()
    
      str_len = mylen()
      print('字符串长度:%s' % str_len)
      字符串长度:11

      return是一个关键字,表示的意思是"返回值,"在pycharm里,你会看到return的颜色变蓝了

      返回值有几种情况:分别是没有返回值、返回一个值、返回多个值

      没有返回值:不写return,会默认返回值为一个None

      #函数定义
      def mylen():
          #计算str的长度
          str = "hello world"
          length = 0
          for i in str:
              length += 1
          print(length)
    
      #函数调用
      str_len = mylen()
      print('字符串长度:%s' % str_len)
      11
      字符串长度:None

      只写return,后面什么都不写,也会返回一个None,这里的用法是函数内部一旦遇到return,就结束整个函数

      def ret_mode():
          print("start")
          return
          print("end")
        
      ret = ret_mode()
      print(ret)
      start
      None

      return None:和上面的情况一样,我们一般不这么写

      返回一个值:只需要在return后面加上要返回的内容就可以了

      #函数定义
      def mylen():
          #计算str的长度
          str = "hello world"
          length = 0
          for i in str:
              length += 1
          return length
    
      #函数调用
      str_len = mylen()
      print('字符串长度:%s' % str_len)
      字符串长度:11

      返回多个值:可以返回任意多个、任意数据类型的值

      def ret_demo1():
          #返回多个、同一类型的数据
          return 1,2,3,4
    
      def ret_mode2():
          # 返回多个、任意类型的数据
          return 1, ['a','b','c'],3,4,'abc'
    
      ret1 = ret_demo1()
      print(ret1)
    
      ret2 = ret_mode2()
      print(ret2)
      (1, 2, 3, 4)
      (1, ['a', 'b', 'c'], 3, 4, 'abc')

      返回多个值会被组织成元组被返回,也可以用多个值来接收

      def ret_demo1():
          #返回多个、同一类型的数据
          return 1,2,3,4
    
      def ret_mode2():
          # 返回多个、任意类型的数据
          return 1, ['a','b','c'],3,4,'abc'
    
      #返回多个值,用一个变量接收
      ret1 = ret_demo1()
      print(ret1)
      print()
      #返回多个值,用多个变量接收,返回几个值,就用几个变量接收
      a,b,c,d,e = ret_mode2()
      print(a)
      print(b)
      print(c)
      print(d)
      print(e)
      (1, 2, 3, 4)
    
      1
      ['a', 'b', 'c']
      3
      4
      abc

    四、函数的参数

      现在,我们已经把函数返回值的相关事情弄明白了,我们已经完成了一个可以返回字符串长度的函数mylen()。但是现在这个函数还是不是很完美,之前我们使用len()函数的时候,是length = len('hello world'),这样我们可以想计算谁就计算谁的长度。但是现在我们写的这个函数,只能计算一个'hello world'这个字符串的长度,换一个字符串好像就不行了,该怎么办呢?

      #函数定义
      def mylen(str):
          #计算字符串的长度
          length = 0
          for i in str:
              length += 1
          return length
    
      #函数的调用
      str_len = mylen('hello world')
      print('字符串的长度:%s' % str_len)
      字符串的长度:11

      我们告诉mylen()函数要计算的字符串是谁,这个过程叫做传到参数,简称:传参,我们调用函数时传递的 'hello world' 和定义函数时的 str 就参数, 'hello world' 是实参,str是形参

      实参、形参

         'hello world' 是调用函数时实际传递的参数,简称:实参

        定义函数 mylen(str) 的 str,只是一个变量的名字,被称为形式参数,在定义函数的时候它表示的只是一个形式,表示函数这里有一个参数,简称:形参

      传递多个参数:参数可以传递多个,多个参数之间用逗号分割

      def mymax(x,y):
          the_max = x if x > y else y
          return the_max
    
      max = mymax(10,20)
      print(max)
      20

      位置参数:从实参角度讨论

        1、按照位置传值

      def mymax(x,y):
          #此时 x = 10, y = 20
          the_max = x if x > y else y
          return the_max
    
      max = mymax(10,20)
      print(max)

        2、按照关键字传值

      def mymax(x,y):
          #此时 x = 20, y = 10
          the_max = x if x > y else y
          return the_max
    
      max = mymax(y = 10,x = 20)
      print(max)
    20

        3、位置、关键字形式混合使用

      def mymax(x,y):
          #此时 x = 20, y = 10
          the_max = x if x > y else y
          return the_max
    
      max = mymax(10,y = 20)
      print(max)

      正确的用法:

        1、位置参数必须在形式参数的前面

        2、一个形参只能赋值一次

      位置参数:从形参的角度来讨论

        1、位置参数必须传值

      def mymax(x,y):
          the_max = x if x > y else y
          return the_max
    
      #调用mymax不传递参数
      max = mymax()
      print(max)
      TypeError: mymax() missing 2 required positional arguments: 'x' and 'y'

      默认参数:将变化比较小的参数,设置为默认参数

        1、默认参数的定义

      def stu_info(name,sex = ''):
          """打印学生信息函数,由于班级中大部分学生是男生,所以设置默认参数:sex的默认值为 '男'"""
          print(name,sex)
    
      stu_info('小明')
      stu_info('小红','')
      小明 男
      小红 女

        2、参数陷阱:默认参数是一个可变数据类型

      def default_param(name,list=[]):
          list.append(name)
          print(list)
    
      default_param('alex')
      default_param('eqon')
      ['alex']
      ['alex', 'eqon']

      动态参数

      动态参数,也叫不定长传参,当需要传给函数的参数很多,个数不定的情况下,就需要使用 *args,**kwargs 来接收,
      args是元组形式,接收除去键值对以外的所有参数,kwargs接收的只是键值对的参数,并保存在字典中
      def trans_param(*args,**kwargs):
          print(type(args))
          print(args)
          print(type(kwargs))
          print(kwargs)
    
      trans_param('jinxin',12,[1,2,3,4],[2,3],(1,4,7),{'a':'123','c':456},country = 'china')
      <class 'tuple'>
      ('jinxin', 12, [1, 2, 3, 4], [2, 3], (1, 4, 7), {'a': '123', 'c': 456})
      <class 'dict'>
      {'country': 'china'}

     

  • 相关阅读:
    cookie
    iOS本地推送
    2020-06-17:红锁的设计思想?
    2020-06-16:Redis hgetall时间复杂度?
    2020-06-15:Redis分布式锁怎么解锁?
    2020-06-14:Redis怎么实现分布式锁?
    2020-06-13:Redis底层数据结构?
    2020-06-12:推箱子自动求解。
    2020-06-11:Redis支持的数据类型?
    2020-06-10:给定一个无序数组,里面数都是成双数的,只有一个数是成单数的,求这个数? 来自
  • 原文地址:https://www.cnblogs.com/nzd123456/p/8966409.html
Copyright © 2011-2022 走看看