今天记一下学到的python函数相关知识.

目录:

1.函数简介

2.函数定义

3.函数参数

第一部分:函数简介

    我们在编程过程中往往会碰到这样的事情-----很多地方都用到了相同的一段代码.虽然复制/粘贴这段代码不费多大的功夫,但是这样就无声中增加了程序的维护成本.比如,我们后来需求变动了,要修改原来的这段共用代码才能完成目的,这样如果这段代码在很多地方出现,我们只能一处一处的发现并修改.后来我们有个想法,将这段代码单独拿出来,并给这段代码起一个名字,我们在用到这段代码的地方直接使用这个名字来代替这段代码,那如果日后还要修改这里,我们就可以只修改一处,因为名字没有改变,其他使用名字来替换代码的地方也就不需要改变.这样以来即减少了代码的行数,也方便了日后的维护,我们给拿出来的这段代码起了个名字:函数,每个函数都有一个名字,叫函数名,其他的代码使用这个函数的时候,通过函数名调用这个函数就可以了.

下面我们写一个函数的简单例子:

 login_status = 0                #定义一个记录登录状态的变量

 def weclome_user():            #定义一个函数,函数的功能就是打印"Weclome !"
print('Welcome !") while not login_status:
name = input('Input username here: ')
if name:
10 login_status = 1
welcome_user()
12 #do other things

上面的例子,如果用户输入有效的用户名,就会调用函数 welcome_user, 该函数实现打印"Weclome !"的作用,接着就跳出 while循环做其他的工作.

上面简单的介绍了函数的定义和使用,函数的定义就是函数实现功能的那段代码,函数的使用就是通过 函数名 来使用.

第二部分:函数定义

函数的定义阶段只检查函数的语法,不执行函数.(备忘)

 def hello():
x
print('foo')

向上面这样的定义是不会有问题的,因为没有调用函数

函数定义的方式简单的分为以下两种

无参数函数:

先看一个例子:

 def print_hello():    #函数定义
print('*'*40)
print('hello')
print('*'*40)
5 print_hello() #函数的使用

上面的函数就是无参数函数,这些函数往往是做一些操作而没有返回值(return somethings).

  有参数函数:

看一个例子:

 def put_together_hello(name=''):                  #函数包含一个参数
valid_user='xiaoming'
print('*'*40)
res_str = hello %s' % name
return res_str #返回一个字符串
name = input('Input username here: ') result=put_together_hello(name) 给函数传递一个参数
10 print(result)

我们给上面的函数传递了一个值,这个传给函数的值,通常叫做函数的参数,并且在函数末尾用 return  返回了一个值,我们在函数调用处用一个新的变量接收该值,并且打印.

第三部分:函数参数

有参函数的参数可大致分为5种情况:

1).位置参数

2).关键字参数

3).默认值参数

4).可变长参数( *args,**kwargs)

5).命名关键字参数

下面分别介绍:

第一种情况:位置参数:

 def print_info(name,age):
print('your name is %s and your are %d years old' % (name,age)) name='xiaoming'
age=16
print_info(name,age) 结果:
your name is xiaoming and your are 16 years old

上面是位置参数,简单来说,就是调用的时候,参数的位置,应该和函数定义处的函数位置相同,这样才能打印出正确的信息.

第二种情况:关键字参数:

 def print_info(name,age):
print('your name is %s and your are %d years old' % (name,age)) name='xiaoming'
age=16
print_info(age=age,name=name) 结果:
your name is xiaoming and your are 16 years old

这里传递参数的时候指定了传递参数的关键字,就是将age变量赋值给age参数,就是将name变量赋值给name参数.这样的就没有问题.

第三种情况:默认参数

 def print_info(name,age=17):
print('your name is %s and your are %d years old' % (name,age)) name='xiaoming'
age=16
print_info(age=age,name=name) print_info('xiaohong') print_info('xiaohong',20) 结果:
your name is xiaoming and your are 16 years old
your name is xiaohomg and your are 17 years old
your name is xiaohong and your are 20 years ol

上面的例子,函数定义的时候,给了一个默认的参数age=17,我们将这样含有这种默认值的参数叫做默认值参数,既然函数已经有一个默认值,因此我们可以给函数传递age这个信息,也可以不传age信息,如果传了age信息,则函数运行的时候会将我们传递的age覆盖默认的值(16).如果我们没有传递参数信息,则输出函数的时候会输出默认值(16).有种情况需要注意,在函数定义的时候,默认值参数必须在没有默认值的参数的右侧.

    第四种情况:可变长参数

 def print_info(name,age,*args,**kwargs):
2 print('your name is %s and your age is %d' % (name,age))
print(args)
print(kwargs) print_info('xiaoming',16,'football','baskatball',favorite_color='black',favorite_book='A') 结果:
8 yourname is xiaoming and your age is 16
('football', 'baskatball') #元组
{'favorite_book': 'A', 'favorite_color': 'black'} #字典

我们这里定义print_info函数,顺便打印了除name 和 age之外的变量,这里除了函数前面的两个值按位置赋值给name 和age外,其余多传递的值中,单个字符串或其他单个变量的都被赋值给args,包含简单语句"A=B"的变量都被赋值给kwargs变量,从上面我们也可以看出,args是一个tuple(元组),而kwargs是一个dict(字典).

第五种情况:命名关键字参数

 def foo(name,age,*,sex='male',height):
print(name,age)
print(sex)
print(height) # * 后定义的参数为命名关键字参数,这类参数必须被传值,而且必须以"变量名= 变量值"的形式传值 foo('xiaoming',16,height='') 结果:
xiaoming 16
male
18

再来看其他的例子:

 def foo(*args):
print(args) foo(1,2,3,4)
foo(*['a','b','c','d']) #*['a','b','c','d'] =='a','b','c','d'
#==>f(*['a','b','c','d']) ==> f('a','b','c','d')
#* 打散后面的参数,使之成为位置参数

再来一个例子:

 def foo(**kwargs):
print(kwargs) foo(x=1,y=2) #x=1,y=2 == **{'y':2,'x':1}
#==> foo(**{'y':2,'x':1}) == foo(x=1,y=2)
#** 将后面的字典打散成为关键字参数 #结果
{'x':1,'y':2}

python函数(一)的更多相关文章

  1. python 函数之day3

    一 函数的语法及特性 什么是函数? 定义:函数是一个功能通过一组语句的集合,由名字(函数名)将其封装起来的代码块,要想执行这个函数,只要调用其函数名即可. 特性: 减少重复代码 使程序变的可扩展 使程 ...

  2. Python函数作用域的查找顺序

    函数作用域的LEGB顺序 1.什么是LEGB? L:local 函数内部作用域 E:enclosing 函数内部与内嵌函数之间 G:global 全局作用域 B:build-in 内置作用域 2.它们 ...

  3. Python函数讲解

    Python函数

  4. Python函数信息

    Python函数func的信息可以通过func.func_*和func.func_code来获取 一.先看看它们的应用吧: 1.获取原函数名称: 1 >>> def yes():pa ...

  5. Python函数参数默认值的陷阱和原理深究"

    本文将介绍使用mutable对象作为Python函数参数默认值潜在的危害,以及其实现原理和设计目的 本博客已经迁移至: http://cenalulu.github.io/ 本篇博文已经迁移,阅读全文 ...

  6. Python开发【第四章】:Python函数剖析

    一.Python函数剖析 1.函数的调用顺序 #!/usr/bin/env python # -*- coding:utf-8 -*- #-Author-Lian #函数错误的调用方式 def fun ...

  7. Python函数解析

    对于Python的函数,我们需要记住的是: 1. 函数的默认返回值是None. 2. python是一个自上而下逐行解释并执行的语言.因此,函数的定义必须在函数被调用之前.同名的函数,后定义的会覆盖前 ...

  8. Python入门笔记(18):Python函数(1):基础部分

    一.什么是函数.方法.过程 推荐阅读:http://www.cnblogs.com/snandy/archive/2011/08/29/2153871.html 一般程序设计语言包含两种基本的抽象:过 ...

  9. Python函数1

    Python 函数命令的使用 想想我们之前数学中学到的函数,首先我们需要定义一个函数,例如f(x)=x, 当x输入任意数的时候,f(x)都能输出和x相等的数值. 那么在Python中是如何实现的呢? ...

  10. python函数传参是传值还是传引用?

    首先还是应该科普下函数参数传递机制,传值和传引用是什么意思? 函数参数传递机制问题在本质上是调用函数(过程)和被调用函数(过程)在调用发生时进行通信的方法问题.基本的参数传递机制有两种:值传递和引用传 ...

随机推荐

  1. vue中的常用三元

    点击事件的三元 <el-button type="primary" @click="edit == 'mod' ? sureModify() : submit()& ...

  2. 如何将spring源码导入到eclipse中

    如何将spring源码导入到eclipse中 1. 下载spring源码  可以在github官网中找到spring源码来下载,或者直接通过git下载,是一样的,这里演示 直接在github网站下载, ...

  3. 用jquery写出图片自动轮播效果

    相关代码如下,只要把代码粘贴进编辑器,修改图片路径,即可看到效果. 1.html部分 <body>   <ul class="banner">   < ...

  4. HNOI 世界树 虚树

    //virtual tree /*Huyyt*/ #include<bits/stdc++.h> #define mem(a,b) memset(a,b,sizeof(a)) #defin ...

  5. 实操 | 内存占用减少高达90%,还不用升级硬件?没错,这篇文章教你妙用Pandas轻松处理大规模数据

    注:Pandas(Python Data Analysis Library) 是基于 NumPy 的一种工具,该工具是为了解决数据分析任务而创建的.此外,Pandas 纳入了大量库和一些标准的数据模型 ...

  6. 吐槽一下jsoup

    网络爬虫的本质就是通过域名加上特定的路由方式与远程资源建立一个短暂的连接,然后通过io流的方式读取.然后说一下jsoup,jsoup可以说是目前的爬虫工具包里面对java底层的工具类封装最简单的一种了 ...

  7. JAVA 流与文件

    流 InputStream和OutputStream是所有的输入流和输出流的超类.他们两个都是抽象类. read方法和write方法都是阻塞方法,这意味着如果不能里可以写入或者读取,比如因为网络问题, ...

  8. img标签的before,after伪类

    在CSS中总有一些你不用不知道,用到才知道的“坑”.比如今天要谈的,把 before, after 伪类用在 <img> 标签上.嗯,实际上你用你会发现,在大多数浏览器这是无效的,dom中 ...

  9. React组件:Dragact 0.1.4发布

    Dragact 是一款React组件,他能够使你简单.快速的构建出一款强大的 拖拽式网格(grid)布局. 仓库地址:Dragact 经过几天的迭代时间Dragact已经能够支持自由缩放功能了(res ...

  10. 启动SpringBoot web项目出现 Initializing c3p0 pool... com.mchange.v2.c3p0.ComboPooledDataSource [ acquireIncrement -> 3,....

    详细错误信息: Initializing c3p0 pool... com.mchange.v2.c3p0.ComboPooledDataSource [ acquireIncrement -> ...