zoukankan      html  css  js  c++  java
  • Python函数初

    什么是函数?

      先提出一个小练习,不用内置方法,来求一个字符串的长度,比如求s  =  'djskdflsdjfslkjgls',我们可以用多种方法求取,比如:

    1 count = 0
    2 s = 'djskdflsdjfslkjgls'
    3 for i in s:
    4     count += 1
    5 print(count)

    通过上面的for循环,我们可以很方便的计算出结果。

    若我们用python的内置函数len(),则只使用一个指令即可求出结果。如果我们用如下方法做时:

    1 def my_len():
    2     l = [1, 2, 3, 4, 5, 6, 7, 8]
    3     count = 0
    4     for i in l:
    5         count += 1
    6     print(count)
    7 my_len()  

    当我们直接使用调用我们定义的my_len()方法时,其结果也可以直接获取。

    这里,我们将my_len()称为执行函数,其组成是由 :函数名()

    通过上面分析,我们知道函数有很多优点,总结起来可分为两点:

    1. 函数可以减少代码的重复性

    2. 函数可以增强代码的阅读性

    函数到底是什么?其主要目的是什么?接下来我们做一个详解。

    函数其主要的目的就是为了将用户的需求用代码表示出来,然后将其封装,提供一个函数接口,供用户后续直接调用。 

    1 def func():
    2     print('111')
    3     print('222')
    4 func(

    上述函数中,函数执行的功能只是将需要显示的内容打印出来。但是通常执行函数后,希望将执行结果给输出,这样,我们就要引进函数的返回值:return

    return 有什么功能呢?

    1. 函数中如果遇到return,则直接结束函数

    2. 给函数中的执行者(函数名():整体是函数的执行者)返回值

    3. return 返回单个值,即原封不动的返回(是什么类型,就返回什么类型值)

    4. return 返回多个值,即返回一个元组,所有值都是元组的一个元素

    注:在工作中,通常函数尽量不要使用print。

    对以上return分别举例:

    1. 函数中如果遇到return,则直接结束函数

    1 def func():
    2     print('111')
    3     print('222')
    4     return
    5     print('333')
    6 func()

    函数执行的结果为:111,222。函数执行后,当遇到return,直接结束函数,后面语句不再执行。

    2 return 返回单个值

     1 def func_1():
     2     a = 1
     3     b = 2
     4     c = a + b
     5     d = [1,2,3]
     6     e = (4,5,6,7)
     7     f = 'olin'
     8     g = ' beault'
     9     h = f + g
    10     return h
    11 print(func_1())

    3 return多个值,返回的是一个元组

    1 def func_1():
    2     a = 1
    3     b = 2
    4     d = [1,2,3]
    5     e = (4,5,6,7)
    6     f = 'Colin'
    7     return a,d,e,f
    8 print(func_1())

    上面的代码执行结果为:(1, [1, 2, 3], (4, 5, 6, 7), 'Colin') ,多个值返回的是一个元组,每个值是元组的一个元素。

    函数的传参

    函数的参数分为:函数实参与函数形参。

    实参:函数执行者(实参)实际的参数

    形参:定义函数时,括号里面的参数

    实参

    对于实参,通常有三种表示方式:

    1. 位置参数

    2. 关键字参数

    3. 混合参数

    位置参数:要求:按照顺序,一一对应

    1 def func1(x, y):
    2     print(x, y )
    3 func1(1,2)
    1 def add(x, y):
    2     c = x +y
    3     return c
    4 print('x + y =', add(1, 2))
    1 def max(x, y):
    2     if x > y:
    3         c = x
    4     else:
    5         c = y
    6     return c
    7 print('较大的值为:', max(32, 45))

    关键字参数:要求:可以不按照顺序,但是必须一一对应

    1 def func1(x, y):
    2     return x + y
    3 print(func1(y = 100, x = 32))

    混合参数:要求:关键字参数一定要在位置参数之后

    1 def func1(a, b, x, y):
    2     return a + b + x + y
    3 print(func1(100, 56, y = 100, x = 32))
    4 
    5 def func1(a, b, name, x, y):
    6     return a + b + x + y
    7 name = 'Colin'
    8 print(func1(100, 56, name, y = 100, x = 32))  # name 是位置参数

    形参

    从形参角度去分析,形参主要分为位置参数与默认参数两种。

    位置参数:按照顺序一一对应

    1 def func(x, y ,z):
    2     print(x, y,z)
    3 func(1,2,3)

    默认参数:给其传值,将原默认参数覆盖,不传值时不报错,使用默认值

    1 def func1(x, y, a = 666):
    2     print(x, y, a)
    3 func1(1, 2)
    4 func1(1, 2, 256)

    应用场合 :不经常改变的参数,但是一直再用。

    下面提供一个要求,需要不断输入个人信息,如姓名与性别。并将信息写入文件中。

    方法1:不使用函数功能

     1 while 1:
     2     name, sex = input('请输入姓名与性别,中间用逗号分隔:').strip().replace('',',').split(',')
     3     if name.upper() == 'Q':
     4         break
     5     with open('a1.txt',encoding='utf-8',mode= 'a') as f1:
     6         f1.write('{}|{}
    '.format(name, sex))

    方法2:使用函数功能

     1 def namelist(name, sex = ''):
     2     with open('a1.txt', encoding='utf-8', mode='a') as f1:
     3         f1.write('{}|{}
    '.format(name, sex))
     4 while 1:
     5     name, sex = input('请输入姓名,性别').strip().replace('', ',').split(',')
     6     if name.upper() == 'Q': break
     7     if sex.strip():
     8         namelist(name, sex)
     9     else:
    10         namelist(name)
    11 namelist(name, sex)

    默认参数的陷阱

    默认参数若是可变数据类型(如:list),但他始终使用的是一个,即默认参数共用一个内存地址。

    1 def func1(x, l1 = []):
    2     l1.append(x)
    3     return l1
    4 ret = func1(1)
    5 print(ret,id(ret))   # [1] 1835140980104
    6 ret2 = func1(100)
    7 print(ret2,id(ret2))  # [1, 100] 1835140980104
  • 相关阅读:
    LVM详解
    redis数据类型
    radis数据库安装
    POJ3294 Life Forms 【后缀数组】
    BZOJ1076 [SCOI2008]奖励关 【状压dp + 数学期望】
    POJ2774 Long Long Message 【后缀数组lcp】
    POJ2406 Power Strings 【KMP 或 后缀数组】
    POJ3261 Milk Patterns 【后缀数组】
    BZOJ3289 Mato的文件管理 【莫队 + 树状数组】
    BZOJ2460 [BeiJing2011]元素 【线性基】
  • 原文地址:https://www.cnblogs.com/colin1314/p/9482007.html
Copyright © 2011-2022 走看看