Python之函数学习(八)

python语言,即可以进行函数式的编程的语言,又是可以进行面向对象编程的语言,所谓函数,简单的理解就是将一些语句集合到一起,这样可以在程序中多次的调用,而不需要为了某个功能写重复性的代码,这就是函数的魅力所在。在python中,函数的定义是使用关键字def,下面先来定义一个简单的函数,通过这个例子来认识函数,见代码:

def f():
   print('Hello World')

在如上的代码中,可以看到自定义了函数f,函数中输出是 :Hello World,那么编写函数后,怎么来进行调用函数了,函数的调用也是很简单的,像如上的函数调用为:f(),就会输出:Hello World

作为函数来说,都是有参数的,如写一个函数为:二个数想加,返回它的结果值,那么该函数为:

在如上的代码中,可以看到,定义了add的函数,参数分别是a,b,函数的返回值是a+b和的结果,在该函数中,a和b就是函数的形式参数,那么什么是实际参数了,调用函数add(2,3),在这里,2和3就是函数的实际参数,另外特别的注意,在函数中,return后还可以执行其他的语句,答复是不行的,切记,在函数中,一旦执行了return后,函数执行过程立即终止,不再执行,在函数中,return后是函数的返回值,如果没有return,函数的默认返回值是None。

在python语言中,函数可以有默认的参数,这是其他语言所不具备的,当然,也可以对默认的参数依据实际的需求进行修改,在具体的项目中依据集体的案例来进行。就仍然以add函数为案例来说明,见函数的默认参数的代码:

调用函数的时候,如果不对函数的默认参数进行修改,该函数返回的结果是5,当然,也可以对其中一个函数二个参数都进行修改,再调用函数,见修改第一个参数后,函数执行的结果:

也可以对二个参数都进行修改,见修改的代码以及执行的结果:

在如上的案例中,可以清晰的看到,函数的默认参数,可以修改,也可以不修改,具体的情况依据在项目中具体的情况来进行应用,但是特别得注意,在一个函数中,如果有多个形式参数,那么默认参数只能是最后一个参数,不能把默认参数在前面,其他的形式参数在后面,这样代码会提示错误的,见错误信息:

在如上中,可以看到,如果默认参数在前面,形式参数在后面,该函数代码提示错误。在python的数据结构中,分别是列表,元组,字典,以及set集合,在实际的项目中,函数的参数也有可能是动态参数,那么有么有可能,让元组或者字典成为函数的参数了,当然是可以的,在python的函数中,*代表元组,**代表字典,下面就分别就实际的案例来说明这个过程,定义一个函数,以元组作为参数,输出参数并查看参数的类型,见

代码以及输出:

在截图中,可以看到函数的参数是元组,在具体以实际的案例再说明这个过程的应用

再来当函数的参数为字典的时候,来演示这样的一个结果,见代码:

可以看到,调用函数的时候,需要说明key和value的值,来演示参数直接是字典,看调用的过程,见如下:

可以看到,代码不同,但是输出的实际结果是一致的。 函数的参数很多时候是静态的,也就是说是普通参数或者是默认参数,以动态参数(*args,**kwargs)的形式,使用的比较少,下面就以函数的动态参数,来实现format的输出,来演示这样的一个过程,大家都知道format是格式化字符串的输出,如:

如果使用*args或者**kwargs实现,实现的效果为:

在函数中,必须要搞清楚,什么是全局变量,什么是局部变量,以及全局变量在函数中的使用,全局变量简单的理解就是在一个模块中的函数都是可以引用的,局部变量仅仅限于在本函数内使用,见实例以及实例的输出:

从函数的执行结果可以看出,f1()输出的是局部变量,f2()函数输出的是全局变量,在函数中,可以修改全局变量吗?假设我想让f1()输出的是全局变量,答案是可以的,使用关键字:global,使用方法为:global 全局变量名称,表示对全局变量重新赋值,对如上的实例修改后,见输出:

函数可以实现模块化的一个过程,比如登录,注册,下面就以函数式的编程实现这个过程,见代码:

def login(username,password):
   """
   用于用户登录
   :param username:用户输入的用户名
   :param password:用户输入的密码
   :return:True,表示登录成功;False:表示登录失败
   """
   f=open('db','r')
   for line in f:
      list=line.split('|')
      if list[0]==username and list[1]==password:
         #登录成功
         return  True
   #用户名或者密码错误
   return False
def info():
   '''登录成功后,获取用户的信息'''
   f=open('db','r')
   for line in f:
      list=line.split('|')
      print('恭喜您登录成功,你的账号为:',list[0])


def register(username,password):
   '''注册函数'''
   f=open('db','a')
   temp=username+'|'+password
   f.write(temp)
   f.close()

def exit():
   '''退出函数'''
   import  sys
   sys.exit(1)

def main():
   while True:
      t=int(input('1、登录 2、注册 3、退出\n'))
      if t==1:
         username=input('请输入用户名:\n')
         password=input('请输入密码:\n')
         r=login(username,password)
         if r:
            print('login success')
            info()
         else:
            print('login fail')
      elif t==2:
         username=input('请输入注册的用户名:\n')
         password=input('请输入注册的密码:\n')
         register(username,password)
      elif t==3:
         exit()

if __name__ == '__main__':
   main()
 
  在python中,三目运算符是很有意思的,特别是在if和else中,可以少写代码,比如写一个判断,见代码:
a=1
if a==1:
   name='python'
else:
   name='java'
如果使用三目运算符,可以很简单的把代码缩小,见实现的效果:
name='python' if a=1 else 'java'

   下面来看lambda表达式,lambda是匿名函数,它的实现效果是为:
函数名称=lambda 函数参数:表达式,见具体的代码:

原文发布于微信公众号 - Python自动化测试(wuya-python)

原文发表时间:2017-08-20

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏nummy

set与frozenset的区别

同多数语言一样,set表示集合,最重要的特性就是无序,所以Python中的set不支持indexing,但支持len(set),x in set 等操作。 s...

8620
来自专栏跟着阿笨一起玩NET

C#修饰符

C#中类及类型成员权限访问修饰符有以下四类:public,private,protected,internal。

25820
来自专栏余林丰

初识Java反射

要详细的了解Java反射,就得要了解Java的类加载以及何为运行时动态加载等等概念。本文抛开其余概念,简单介绍Java反射,详细介绍会在以后有一个系统而全面的认...

283100
来自专栏专注 Java 基础分享

Java并发之synchronized关键字

     上篇文章我们主要介绍了并发的基本思想以及线程的基本知识,通过多线程我们可以实现对计算机资源的充分利用,但是在最后我们也说明了多线程给程序带来的两种典型...

20650
来自专栏Deep learning进阶路

C++随记(三)---动态分配内存问题(2)

C++随记(三)---动态分配内存问题(2)      上一篇博文讲到了使用动态数组时,只要把指针名字当作数组名使用即可,而且指针名可以进行运算,而数组名不...

22400
来自专栏黑泽君的专栏

java基础学习_反射、装饰模式、JDK新特性_day27总结

10620
来自专栏决胜机器学习

正则表达式学习笔记

正则表达式学习笔记 (原创内容,转载请注明来源,谢谢) 首先,学习正则表达式,很推荐一篇博客,http://www.cnblogs.com/deerchao...

368120
来自专栏进击的君君的前端之路

关于es2015箭头函数的大括号代码块部分的一点理解

10720
来自专栏搞前端的李蚊子

使用箭头函数的几个注意事项

刚才写一个需要递归操作的函数,在使用arguments.callee的时候,报错undefined,因为arguments.callee在严格模式下会失效,以为...

38860
来自专栏黑泽君的专栏

打印println()方法的逻辑

9620

扫码关注云+社区

领取腾讯云代金券