Python之路---初识函数️

程序员三大美德:

  1. 懒惰

因为一直致力于减少工作的总工作量。

  1. 缺乏耐性

因为一旦让你去做本该计算机完成的事,你将会怒不可遏。

  1. 傲慢

因为被荣誉感冲晕头的你会把程序写得让谁都挑不出毛病来。

大家好, 现在让我们一起来学习一下函数

Why-为什么要使用函数?

现在我们需要计算一个字符串的长度,我们可以直接使用len()方法:

num = len('hello')

但是如果我们不用len方法,怎么实现这个需求?其实也不难:

s = 'hello'
length = 0
for i in s:
length += 1 print(length)

好了,功能实现了,然后又有一个需求(产品经理日常加需求),要计算另一个字符串的长度---“world”。

于是,本着程序员三大美德,我们使用最强大的快捷键---Ctrl+c , Ctrl+v:

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

这样确实可以实现需求,但是总感觉不是那么完美,为什么呢?

首先,之前我只需要执行len方法就可以拿到一个字符串的长度,而现在为了实现相同功能,我们需要把相同的代码写很多遍 --- 代码冗余

其次,刚刚的代码不是那么容易读懂 ---- 可读性差

我们就想,要是我们能像使用len一样使用我们这一大段“计算长度”的代码就好了。这种感觉有点像给这段代码起了一个名字,等我们用到的时候直接喊名字就能执行这段代码就行。

函数定义与调用

现在教大家一个技能,把代码装起来:

def mylen():
"""计算字符串长度"""
s = 'hello'
length = 0
for i in s:
length += 1
print(length)

来分析下这段代码:

​ 其实除了def这一行和后面的缩进,其它的和前面的代码是一样的。

​ 现在执行以下,你会发现啥也没发生!

​ 因为这里我们只是把代码装起来了,还不会往外拿,拿应该怎么拿出来呢?

mylen()

这就是代码取出来的过程。

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

总结:

定义:

  • def关键字开头,空格后接函数名称圆括号(),最后还有一个“:”

  • 函数名只能包含字符串、下划线和数字且不能以数字开头。虽然函数名可以随便起,但我们给函数起名字还是要尽量简短,并能表达函数功能

  • 括号:是必须加的,先别问为啥要有括号,总之加上括号就对了!

  • 注释:每一个函数都应该对功能和参数进行相应的说明,应该写在函数下面第一行。以增强代码的可读性。

    调用: 就是 函数名() 要记得加上括号

函数返回值

前面我们写了一个函数,这个函数可以帮助我们计算字符串的长度,并且把结果打印出来。但是,这和我们的len方法还不是太一样。以前我们调用len方法会得到一个值,我们可以用一个变量来接收这个值。

str_len = len('hello')

那么我们写的函数能做到吗?

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

执行代码,获得的输出结果是str_len值为None,这说明什么也没返回

那么应该怎么让他有返回值呢?

return

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

只需要在函数最后加上一个return的关键字,return后面写上你要返回的值就可以了

return关键字的作用

​ return 是一个关键字,在pycharm里,你会看到它变成蓝色了。

​ 这个词翻译过来就是“返回”,所以我们管写在return后面的值叫“返回值”

  • 没有返回值:

    • 不写return的情况下,会默认返回一个None
    • 只写return,后面不写其他内容,也会返回None,那么为啥要写呢?return的其他用法,就是一旦遇到return,结束整个函数。  
    • return None:和上面的两种情况一样,我们一般不这样写。
  • 返回一个值:

    ​ 注意:*return和返回值之间要有空格,可以返回任意数据类型的值

  • 返回多个值:

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

      def demo1():
      '''返回多个值'''
      return 1,2,3,4 def demo2():
      '''返回多个任意类型的值'''
      return 1,['a','b'],3,4 ret1 = demo1()
      print(ret1)
      ret2 = demo2()
      print(ret2)
    • 返回的多个值会被组织成元组被返回,也可以用多个值来接收

      def demo3():
      return 1,['a','b'],3,4 #返回多个值,用一个变量接收
      ret3 = demo3()
      print(ret2) #返回多个值,用多个变量接收
      a,b,c,d = demo3()
      print(a,b,c,d) #用多个值接收返回值:返回几个值,就用几个变量接收
      a,b,c,d = demo3()
      print(a,b,c,d)

函数的参数

这个函数还是不完美,因为之前我们使用len函数的时候,是可以想计算谁就计算谁的长度,但是我们写的这个函数只能计算“hello”的长度,换一个字符串就需要更改函数内部的变量,这样可不行,那应该怎么办?

带参数的函数:

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

我们告诉mylen函数要计算的字符串是谁,这个过程叫做传递参数,简称传参,调用函数

时传递的这个“hello”和定义函数的s就是参数

实参和形参

我们调用函数时传递的这个“hello”被称为实际参数,因为这个是实际的要交给函数的内容,简称实参。

定义函数时的s,只是一个变量的名字,被称为形式参数,因为在定义函数的时候它只是一个形式,表示这里有一个参数,简称形参。  

传递多个参数

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

def mymax(x,y):
"""比较两个数的大小"""
the_max = x if x > y else y
return the_max the_max = mymax(9,99)
print(the_max)

正是因为需要传递多个参数,所以才有了下面的参数类型

1.位置参数

按照位置传值:

def mymax(x,y):
"""比较两个数的大小"""
the_max = x if x > y else y
return the_max the_max = mymax(9,99)
print(the_max)

2.关键字参数

按照关键字传值:

def mymax(x,y):
"""比较两个数的大小"""
the_max = x if x > y else y
return the_max the_max = mymax(y=99, x=9)
print(the_max)

PS:位置、关键字形式混着用

def mymax(x,y):
"""比较两个数的大小"""
the_max = x if x > y else y
return the_max the_max = mymax(9, y=99)
print(the_max)

正确用法:

  1. 位置参数必须在关键字参数的前面
    2. 对于一个形参只能赋值一次  

3. 默认参数

why?将变化比较小的值设置成默认参数

def info(name, sex='男'):
"""打印学生信息"""
print(name, sex) info('马克')
info('王富贵', '女')

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

def func(a, l=[]):
l.append(a)
print(l) func(1)
func(2)
func(3)

4. 动态参数(不定长参数)

  1. *args:按位置传值多余的参数都由args统一接收,保存成一个元组的形式

    def mysum(*args):
    """求和"""
    the_sum = 0
    print(args) # 保存成元组形式
    print(type(args)) for i in args:
    the_sum += i
    return the_sum sum = mysum(10, 20, 30)
    print(sum)
  2. **kwargs:按位置传值多余的参数都由kwargs统一接收,保存成一个字典的形式

    def stu_info(**kwargs):
    print(kwargs) # 保存成字典
    print(kwargs['name']) stu_info(name='不喜欢马赛克的马克', sex='男')

总结

函数:

参数:

08-Python之路---初识函数的更多相关文章

  1. python之路——初识函数

    阅读目录 为什么要用函数 函数的定义与调用 函数的返回值 函数的参数 本章小结 返回顶部 为什么要用函数 现在python届发生了一个大事件,len方法突然不能直接用了... 然后现在有一个需求,让你 ...

  2. python之路--初识函数

    一 . 函数 什么是函数 f(x) = x + 1 y = x + 1 # 函数是对功能或者动作的封装 函数的语法 def 函数名(): 函数体 调用: 函数名() def play(): print ...

  3. python基础之 初识函数&函数进阶

    函数基础部分 1.什么是函数? 函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段.函数能提高应用的模块性,和代码的重复利用率. 2.定义函数 定义:def 关键词开头,空格之后接函数名 ...

  4. Python之路【第五篇】python基础 之初识函数(一)和文件管理

    转载请注明出处http://www.cnblogs.com/wupeiqi/articles/5453708.html 函数 一.背景                                 ...

  5. python爬虫之路——初识函数与控制语句

    介绍python函数的定义与使用方法,介绍Python的常用控制语句:判断和循环 函数: 格式 def   函数名(参数1,参数2): return ‘结果’ 判断语句:就是多选一 二选一: if c ...

  6. Python之路 day3 函数定义 *args及**kwargs

    #!/usr/bin/env python # -*- coding:utf-8 -*- #Author:ersa import time # def logger(): # time_format ...

  7. 小白的Python之路 day3 函数

    1.函数基本语法及特性 背景提要 现在老板让你写一个监控程序,监控服务器的系统状况,当cpu\memory\disk等指标的使用量超过阀值时即发邮件报警,你掏空了所有的知识量,写出了以下代码 1 2 ...

  8. python之路(九)-函数装饰器

    装饰器 某公司的基础业务平台如下: def f1(): print('这是f1业务平台') def f2(): print('这是f2业务平台') def f3(): print('这是f3业务平台' ...

  9. python之路--初识面向对象

    一 . 初识面向对象 面向过程: 一切以事务的发展流程为中心. 面向对象: 一切以对象为中心. 一切皆为对象. 具体的某一个事务就是对象 打比方: 大象进冰箱 步骤: 第一步, 开门, 第二步, 装大 ...

随机推荐

  1. Linux下解压rar压缩包

    wget http://www.rarlab.com/rar/rarlinux-x64-4.2.0.tar.gz rar软件不需要安装,直接解压到/usr/local下,以下操作需要有root权限. ...

  2. Qt5 escape spaces in path

    There are two possible ways. You can either use escaped quotes (inserting the string between quotes) ...

  3. Fedora 21下lingo14配置

    Install lingo14 during Fedora 21 The first step:Download lingo14Download address:http://www.lindo.co ...

  4. Qt提示:setLayout: Attempting to set QLayout "" on MainWindow "MainWindow", which already has a layout

    如题,出现这个的原因是,如果你的窗口继承的是QMainwindow,需要设置setCentralWidget(); 如下: QWidget * widget = new QWidget ( mainW ...

  5. Golang Context 的原理与实战

    本文让我们一起来学习 golang Context 的使用和标准库中的Context的实现. golang context 包 一开始只是 Google 内部使用的一个 Golang 包,在 Gola ...

  6. String-StringBuilder-StringBuffer 的区别

    String StringBuilder StringBuffer 的区别 String:不可改变的字符串,不能够被修改                    (https://baijiahao.b ...

  7. 一个简单的wed服务器SHTTPD(7)———— SHTTPD内容类型的实现

    //start from the very beginning,and to create greatness //@author: Chuangwei Lin //@E-mail:979951191 ...

  8. matlab-均值滤波

    均值滤波 主要思想为邻域平均法,即用几个像素灰度的平均值来代替每个像素的灰度.有效抑制加性噪声.缺点:容易引起图像模糊,可以对其进行改进,主要避开对景物边缘的平滑处理. 均值滤波器的缺点是存在着边缘模 ...

  9. ES[7.6.x]学习笔记(七)IK中文分词器

    在上一节中,我们给大家介绍了ES的分析器,我相信大家对ES的全文搜索已经有了深刻的印象.分析器包含3个部分:字符过滤器.分词器.分词过滤器.在上一节的例子,大家发现了,都是英文的例子,是吧?因为ES是 ...

  10. GIL-Guilds(黑白灰染色)

    传送门门门门门咩咩咩咩咩咩咩咩咩咩咩咩 \(这题真是扯谈!!!\) \(灰色很高级是吧,但是题目没要你把颜色全部用上去啊!!!\) \(黑色或者白色只有一个条件,但灰色需要和所有三种颜色都相邻.这么难 ...