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'}

     

  • 相关阅读:
    ASP.NET MVC 重点教程一周年版 第二回 UrlRouting
    ASP.NET MVC 重点教程一周年版 第三回 Controller与View
    DynamicData for Asp.net Mvc留言本实例 下篇 更新
    Asp.net MVC视频教程 18 单选与复选框
    使用ASP.NET MVC Futures 中的异步Action
    ASP.NET MVC RC 升级要注意的几点
    ATL、MFC、WTL CString 的今生前世
    msvcprt.lib(MSVCP90.dll) : error LNK2005:已经在libcpmtd.lib(xmutex.obj) 中定义
    关于Windows内存的一些参考文章
    Windows访问令牌相关使用方法
  • 原文地址:https://www.cnblogs.com/nzd123456/p/8966409.html
Copyright © 2011-2022 走看看