Python快速入门——函数

A、函数的定义和调用

1、函数的定义

def 函数名(参数列表):
    "可选函数文档字符串"
    函数体
return 表达式

基于上述格式,下面对函数定义的规则进行说明:

  1. 函数代码块以 def 开头,后面紧跟的是函数名和圆括号
  2. 函数名的命名规则跟变量的名字一样,即只能使用字母、数字和下划线的热门和组合。但是不能以数字开头,并且不能和关键字重名
  3. 函数的参数必须放在括号里卖弄
  4. 函数的第一行可以选择性的使用文档字符串来存放函数说明
  5. 函数内容以冒号开始,并且缩进
  6. return 表达式结束函数,选择性的返回一个 值给调用者。不带表达式的 return 相当于返回None

2、函数调用

def smcs():
    return "三木成森"


print(smcs())

运行结果:

三木成森

Python语言的函数支持嵌套

B、函数的参数

1、参数的传递

def smcs(date):
    return date


print(smcs("三木成森"))

运行结果: 

三木成森

2、默认参数 

Python函数的参数,可以设置默认值,这个参数叫默认参数。由于默认参数已经有了默认值,所以可以忽略,但是其他参数必须要传值。

如果默认参数没有传值,就使用默认值。如果默认参数传值了,就使用传入的值

def smcs(data='三木成森'):
    return data


print(smcs())
print(smcs('你好,三木成森'))

运行结果:

三木成森
你好,三木成森

需要注意的是,带有默认值的参数,一定要位于参数最后面,否则会报错

3、不定长参数

通常在定义一个函数时,若希望函数能够处理的参数个数比当初定义的参数个数多的时候,可以使用函数的不定长参数,其基本语法如下:

def smcs(a, b, *data):
    print(a)
    print(b)
    print(data)
    return

a和b为形参,*data为不定长参数。当调用函数的时候,传入的参数会优先匹配形参的个数,如果从传入的参数数量和形参数量相同,不定长参数会返回空元组或字典,如果传入参数数量超过形参个数,会分为两种情况:

  1. 传入的参数没有指定名称,那么会以元组的形式存放多余的参数

  2. 传入的参数指定了名称,会以字典的形式存放多余的参数


  1. 只有形参
    def smcs(a, b, *data):
        print(a)
        print(b)
        print(data)
        return
    
    
    smcs(1, 2)
     

    运行结果:

    1
    2
    ()

     

  2. 多于形参个数——元组

    def smcs(a, b, *data):
        print(a)
        print(b)
        print(data)
        return
    
    
    smcs(1, 2, 3, 4, 5)

    运行结果:

    1
    2
    (3, 4, 5)

     

  3. 多于形参个数——字典

    def smcs(a, b, **data):
        print(a)
        print(b)
    
        print(data)
    
    smcs(1, 2, n='n', m='m')

    运行结果:

    1
    2
    {'n': 'n', 'm': 'm'}

     

C、变量作用域

1、LEGB原则

Python作用域一共有四种:

  1. L(Local)函数内的区域,包括局部变量和参数
  2. E(Enclosing)外面嵌套函数区域,常见的是闭包函数的外层函数
  3. G(Global)全局作用域
  4. B(Built-in)内建作用域

Python中变量是采用L→E→G→B的规则查找的,即Python检索变量会优先在局部作用域中查找,如果没有找到,便会去局部外的局部找(例如闭包),再找不到就会去全局作用域中找,再者去内建作用域中找

2、局部变量和全局变量

局部变量即定义在 def 函数里面的变量,只能在 def 函数里面使用,反之定义在函数外的变量叫做全局变量

def smcs():
    name = '三木成森'       # 局部变量
    return name


name = smcs()       # 局部变量
print(name)

局部变量只能在函数内访问,全局变量,全局都可以访问

Ps:函数的参数也是局部变量

3、global和nonlocal关键字

当内部作用域想修改外部作用域的时候就需要用到global或nonlocal关键字了

1、global关键字

global关键字用来在函数或其他作用域里面使用全局变量,不用global也可以,就是会有问题

  1. 不使用global关键字
    代码:
    name = '三木成森'
    def smcs():
        name = '你好,三木成森'
    
    
    smcs()
    print(name)

    这是一个没有使用global关键字的代码,运行结果为:

    三木成森

    可以看到运行结果为 三木成森 ,而不是 你好,三木成森 ,原因是因为,在函数里面虽然对name变量进行了修改,但是系统会把函数里面的name变量当做是一个局部变量,又因为函数里面的nama变量是一个局部变量,和外面的全局变量name没有任何关系,所以在函数里修改name变量的值没有用,可以试一下,在函数里面把name变量打印出来

    name = '三木成森'
    def smcs():
        name = '你好,三木成森'
        print(name)
    
    smcs()
    print(name)

    运行结果:

    你好,三木成森
    三木成森

    可以看到,函数里面的name输出为 你好,三木成森,外面的全局变量name输入结果仍然是 三木成森

  2. 使用global关键字
    加上global关键字的代码:

    name = '三木成森'
    def smcs():
        global name
        name = '你好,三木成森'
    
    
    smcs()
    print(name)

    运行结果为:

    你好,三木成森

    可以看到,函数外部的全局变量name的值确实变成了 你好,三木成森

2、nonlocal关键字

nonlocal关键字是在Python3.x版本中新增的,Python2.x版本里面不提供支持,使用nonlocal关键字可以对嵌套函数的外部函数里的局部变量进行修改

和global关键字一样,不使用的话,可以访问,但是不能修改

  1. 不使用nonlocal关键字
    def smcs():
        name = '三木成森'
        def sm():
            name = '你好,三木成森'
        sm()
        print(name)
    
    
    smcs()
    运行结果:
    三木成森
  2. 使用nonlocal关键字
    def smcs():
        name = '三木成森'
        def sm():
            nonlocal name
            name = '你好,三木成森'
        sm()
        print(name)
    
    
    smcs()
    运行结果:
    你好,三木成森

     

D、匿名函数

匿名函数就是没有函数名的函数,也就是不在使用def定义的函数,声明匿名函数需要使用lambda表达式

  1. lambda格式:
    lambda [arg...]:表达式

     

  2. lambda调用

    name = lambda a, b: a+b
    print(name('三木', '成森'))

    运行结果:

    三木成森

     

需要注意的是,使用lambda声明的匿名函数能接受任意数量的参数,但只能返回一个表达式的值。匿名函数不能直接调用print()函数,这是因为lambda需要一个表达式。
注意:

与def函数相比,lambda定义的函数有很多不同的地方

  1. def定义的函数是有名称的,而lambda定义的没有名称,这是最明显的区别
  2. lambda定义的函数通常会返回一个对象或者一个表达式,它不会将返回结果赋值给一个变量,而def风衣的函数则可以
  3. lambda定义的函数中只有一个表达式,函数体也比def定义的函数简单得多,而def定义的函数的函数体是一个语句
  4. lambda表达式的冒号后面只能有一个表达式,def定义的函数则可以有多个
  5. 像if或for等语句不能用于lambda定义的函数中,而def定义的函数则可以使用
  6. lambda一般用来定义简单的函数,而def可以定义复杂的函数
  7. lambda定义的函数不能共享给别的程序调用,而 def定义的函数则可以被调用

E、日期时间函数

1、时间函数

在Python中,通常有一下几种方法表示时间:

  1. 时间戳
  2. 格式化时间字符串
  3. 时间元组(struct_time)

1、时间戳

通常来说,时间戳就是从1970年1月1日00:00:00开始按秒计算的偏移量。返回时间戳的函数主要有time()、clock()等

import time;    # 引入time模块

date = time.time()
print("现在的时间戳为:", date)

运行结果:

现在的时间戳为: 1544612747.7893069

2、格式化时间戳

可以使用time模块的 strftime 函数来格式化日期,定义格式为:

timer.strftime(format[, t])
  • format:格式字符串
  • t:可选参数,是一个struct_time对象
print(time.strftime("%Y-%m-%d", time.localtime()))    # 2018-12-12
print(time.strftime("%a %b %d %H:%M:%S", time.localtime()))   # Wed Dec 12 19:16:57
Python中时间r日期格式化字符串
格式化符号含义
%y两位数的年份表示(00——99)
%Y四位数的年份表示(000——999)
%m月份(01——02)
%d月内中的一天
%H24小时制小时数(0——23)
%l12小时制小时数(0——12)
%M分钟数(00——59)
%S秒(00——59)
%a本地简化的星期名称
%A本地完整星期名称
%b本地简化的月份名称
%B本地完整的月份名称
%c本地相应的日期表示和时间表示
%j年内的一天(001——366)
%p本地A.M或P.M.等价符
%U一年中的星期数(00——53),星期一为星期的开始
%w星期(0——6),星期天为星期的开始
%x本地相应的日期表示
%X本地相应的时间表示
%Z当前时区的名称
%%%本身

3、时间元组(struct_time)

struct_time元组的字段
序号字段含义及取值范围
0tm_year4位数的年份,例如:2018
1tm_mon表示月份,取值范围:1——12
2tm_mday表示天数,取值范围是1——31
3tm_hour表示小时数,取值范围0——23
4tm_min表示分钟数,取值范围0——59
5tm_sec表示秒数,取值范围0——61(60或61是闰秒)
6tm_wday表示星期数,取值范围0——6(0是周一)
7tm_yday表示一年中的第几天,取值范围是1——366(儒略历)
8tm_isdst决定是否为夏令时的标识符,允许的值时-1,0,1
time模块的函数
序号代表含义
1time.altzone
返回格林威治西部的夏令时地区的偏移秒数。如果该地区在格林威治东部会返回负值(如西欧,包括英国)。对夏令时启用地区才能使用。
2time.asctime([tupletime])
接受时间元组并返回一个可读的形式为"Tue Dec 11 18:07:14 2008"(2008年12月11日 周二18时07分14秒)的24个字符的字符串。
3time.clock( )
用以浮点数计算的秒数返回当前的CPU时间。用来衡量不同程序的耗时,比time.time()更有用。
4time.ctime([secs])
作用相当于asctime(localtime(secs)),未给参数相当于asctime()
5time.gmtime([secs])
接收时间戳(1970纪元后经过的浮点秒数)并返回格林威治天文时间下的时间元组t。注:t.tm_isdst始终为0
6time.localtime([secs])
接收时间戳(1970纪元后经过的浮点秒数)并返回当地时间下的时间元组t(t.tm_isdst可取0或1,取决于当地当时是不是夏令时)。
7time.mktime(tupletime)
接受时间元组并返回时间戳(1970纪元后经过的浮点秒数)。
8time.sleep(secs)
推迟调用线程的运行,secs指秒数。
9time.strftime(fmt[,tupletime])
接收以时间元组,并返回以可读字符串表示的当地时间,格式由fmt决定。
10time.strptime(str,fmt='%a %b %d %H:%M:%S %Y')
根据fmt的格式把一个时间字符串解析为时间元组。
11time.time( )
返回当前时间的时间戳(1970纪元后经过的浮点秒数)。
12time.tzset()
根据环境变量TZ重新初始化时间相关设置。
time模块的属性
序号属性说明
1time.timezone
属性time.timezone是当地时区(未启动夏令时)距离格林威治的偏移秒数(>0,美洲;<=0大部分欧洲,亚洲,非洲)。
2

time.tzname
属性time.tzname包含一对根据情况的不同而不同的字符串,分别是带夏令时的本地时区名称,和不带的。

2、日期函数(calendar模块)

calendar模块的有很广泛的方法用来处理年历和月历,比如打印某月的月历

import calendar;    # 引入calendar模块

rl = calendar.month(2019,12)
print(rl)

运行结果:

   December 2019
Mo Tu We Th Fr Sa Su
                   1
 2  3  4  5  6  7  8
 9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31
calendar模块常见函数
序号函数和说明
1calendar.calendar(year,w=2,l=1,c=6)
返回一个多行字符串格式的year年年历,3个月一行,间隔距离为c。 每日宽度间隔为w字符。每行长度为21* W+18+2* C。l是每星期行数。
2calendar.firstweekday( )
返回当前每周起始日期的设置。默认情况下,首次载入caendar模块时返回0,即星期一。
3calendar.isleap(year)

是闰年返回 True,否则为 False。

4calendar.leapdays(y1,y2)
返回在Y1,Y2两年之间的闰年总数。
5calendar.month(year,month,w=2,l=1)
返回一个多行字符串格式的year年month月日历,两行标题,一周一行。每日宽度间隔为w字符。每行的长度为7* w+6。l是每星期的行数。
6calendar.monthcalendar(year,month)
返回一个整数的单层嵌套列表。每个子列表装载代表一个星期的整数。Year年month月外的日期都设为0;范围内的日子都由该月第几日表示,从1开始。
7calendar.monthrange(year,month)
返回两个整数。第一个是该月的星期几的日期码,第二个是该月的日期码。日从0(星期一)到6(星期日);月从1到12。
8calendar.prcal(year,w=2,l=1,c=6)
相当于 print calendar.calendar(year,w,l,c).
9calendar.prmonth(year,month,w=2,l=1)
相当于 print calendar.calendar(year,w,l,c)。
10calendar.setfirstweekday(weekday)
设置每周的起始日期码。0(星期一)到6(星期日)。
11calendar.timegm(tupletime)
和time.gmtime相反:接受一个时间元组形式,返回该时刻的时间戳(1970纪元后经过的浮点秒数)。
12calendar.weekday(year,month,day)
返回给定日期的日期码。0(星期一)到6(星期日)。月份为 1(一月) 到 12(12月)。
import calendar

print(calendar.calendar(2018))
print(calendar.firstweekday())
print(calendar.isleap(2018))
print(calendar.leapdays(2008, 2018))
print(calendar.monthcalendar(2018, 12))
print(calendar.monthrange(2018, 12))

F、随机数函数

使用之前要引入random模块

import random
  1. random.random()
    返回0与1之间的浮点数,范围是0<=N<1.0
    print(random.random())

    运行结果:

    0.2829958140690443

     

  2. random.uniform(a, b)
    返回a与b之间的浮点数N,如果a<b则取值范围是:a<=N<=b,反之则是:b<=N<=a

    print(random.uniform(3, 4))

    运行结果:

    3.7977128084339826

     

  3. random.randint(a, b)
    返回随机数N,取值范围是:a<=N<=b

    print(random.randint(1, 10))

    运行结果:

    5

    注意:a和b必须为整数,并且a的值一定要小于b

  4. random.randrange(start, stop, step)
    返回指定递增基数集合中的一个随机数,基数默认为1,start表示开始,包含在范围中,stop表示结束,不包含在范围中,step表示基数

    print(random.randrange(10, 100, 2))

    运行结果:

    82

    相等于从[10, 12, 14,...,96, 98]中取一个
    上述这些参数必须为整数

  5. random.choice(sequence)
    从sequence中返回一个随机的元素,sequence可以是列表、元组或字符串

    data = [1, 2, 3, 4, 5]
    print(random.choice(data))

    运行结果:

    2

     

  6. random.shuffle(x)
    将列表元素顺序打乱

    data = [1, 2, 3, 4, 5]
    random.shuffle(data)
    print(data)

    运行结果:

    [1, 4, 3, 2, 5]

     

  7. random.sample(sequence, k)
    从指定列表中随机获取k个元素作为一个片段返回,sample函数不会修改原有的序列

    data = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
    print(random.sample(data, 5))

    运行结果:

    [1, 2, 5, 9, 6]

     

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值