函数作用:提高的代码复用性,简化代码

如何快速导入一个模块

alt+回车

函数名,函数体,调用

  1. def say_hello():
  2. name = 'sara'
  3. print('hello,', name)
  4. say_hello()

函数中有return和没有return的区别

  1. def say_hello():
  2. name = 'sara'
  3. print('hello,', name)
  4. def say_hello1(name):
  5. return
  6. def say_hello2(name, name1):
  7. return name, name1
  8. print(say_hello())
  9. print(say_hello1("sara"))
  10. print(say_hello2("sara","john"))

返回结果如下:
image.png

python的位置参数、默认参数、关键字参数、可变参数区别

1.位置参数
调用函数时根据函数定义的参数位置来传递参数。

  1. def say_hello(name,country):
  2. print("%s Welcome to our %s"%(name,country))
  3. # 两个参数的顺序必须一一对应,且少一个参数都不可以
  4. say_hello("sara","China")

输出结果如下:
image.png

2.关键字参数
用于函数调用,通过“键-值”形式加以指定。可以让函数更加清晰、容易使用

  1. # 以下是用关键字参数正确调用函数的实例
  2. # say_hello('sara', country="China")
  3. # say_hello("China", name='sara')
  4. # say_hello(name='sara', country="China")
  5. # say_hello(country="China", name='sara')
  6. # 以下是错误的调用方式
  7. # say_hello(name='sara', "China")
  8. # say_hello(country="China", 'sara')

通过上面的代码,我们可以发现:有位置参数时,位置参数必须在关键字参数的前面,但关键字参数之间不存在先后顺序的

3.默认参数
用于定义函数,为参数提供默认值,调用函数时可传可不传该默认参数的值(注意:所有位置参数必须出现在默认参数前,包括函数定义和调用)

  1. # 正确的默认参数定义方式--> 位置参数在前,默认参数在后
  2. def say_hello(name,country="China"):
  3. print("%s Welcome to our %s" % (name, country))
  4. # 错误的定义方式
  5. def say_hello(country="China", name):
  6. # 调用时不传country的值,则使用默认值China
  7. say_hello('Sara')
  8. # 调用时传入country的值,并指定为Korean
  9. say_hello('Sara', "Korean")

4.可变参数
定义函数时,有时候我们不确定调用的时候会传递多少个参数(不传参也可以)。此时,可用包裹(packing)位置参数,或者包裹关键字参数,来进行参数传递,会显得非常方便。

a)包裹位置传递

  1. def func(*args):
  2. print(args)
  3. func()
  4. func("a")
  5. func("a", "b")

返回结果如下:
image.png
我们传进的所有参数都会被args变量收集,它会根据传进参数的位置合并为一个元组(tuple),args是元组类型,这就是包裹位置传递。

b)包裹关键字传递

  1. def func(**kwargs):
  2. print(kwargs)
  3. func(a=1)
  4. func(a=1, b=2, c=3)

返回结果如下:
image.png
kargs是一个字典(dict),收集所有关键字参数

5.解包裹参数

和*,也可以在函数调用的时候使用,称之为解包裹(unpacking)
a)在传递元组时,让元组的每一个元素对应一个位置参数

  1. def say_hello(name, country):
  2. print("%s Welcome to our %s" % (name, country))
  3. args = ('Sara', 'China')
  4. say_hello(*args)

b)在传递词典字典时,让词典的每个键值对作为一个关键字参数传递给函数

  1. def say_hello(**kwargs):
  2. print (kwargs)
  3. kwargs = {'name': 'Sara', 'country':'China'}
  4. say_hello(**kwargs)

6.位置参数、默认参数、可变参数的混合使用
基本原则是:先位置参数,默认参数,包裹位置,包裹关键字(定义和调用都应遵循)

  1. def func(name, age, sex=1, *args, **kargs):
  2. print (name, age, sex, args, kargs)
  3. func('Sara', 25, 2, 'music', 'sport' ,country='China')

返回结果如下:
image.png
return作用:
遇到return,函数结束;想拿到函数的结果

局部变量和全局变量
image.png
定义在函数体内的变量属于局部变量,作用域只是在函数体内
全局变量作用域是整个程序
如果在函数体内的变量加了global,那么该变量变成全局变量

案例分析:

  1. l = [1, 1, 2, 3, 3,4, 5, 6, 7, 8, 9, 10]
  2. for i in l:
  3. if i % 2 != 0:
  4. l.remove(i)
  5. print(l)

输出结果:[1, 2, 3, 4, 6, 8, 10]
循环删list,会导致下标错乱
第一次循环时,取得时下标为0的值1,不符合条件,删除该元素,此时第二个元素1的下标变成0,所以第二个元素1就没有被删除

解决问题:

  1. l = [1, 1, 2, 3, 3,4, 5, 6, 7, 8, 9, 10]
  2. l1 = l[:]
  3. for i in l1:
  4. if i % 2 != 0:
  5. l.remove(i)
  6. print(l)

函数的参数和返回值进行指定类型和检查

函数参数和返回值的类型指定和检查,以及在新建变量时也可以指定类型。

下面这个函数func,指定了输入参数name为str类型,而country为str类型,并且返回值为srt类型

在方法中,我们最终返回了一个int,此时pycharm就会有警告;
**
当我们在调用这个方法时,参数a我们输入的是字符串,此时也会有警告;
**但非常重要的一点是,pycharm只是提出了警告,但实际上运行是不会报错,毕竟python的本质还是动态语言

  1. def fun1(name: str, country: str = 'china')-> str:
  2. return name, country

参数组(可变参数)

  1. def send_sms(*args):
  2. print(args)
  3. send_sms()
  4. send_sms(110)
  5. send_sms(110, 119)

image.png
关键字参数

可变类型:list ,dict, set
不可变类型:str,tuple,int,float,bool

不可变得类型,必须声明global才可以修改

  1. names = ['sara', 'john']
  2. a = 1
  3. def add_name():
  4. name = input('name:')
  5. names.append(name)
  6. a = 1
  7. add_name()

匿名函数

  1. # 没有名字的函数
  2. f1 = lambda a, b: 1 if a > b else 2
  3. f2 = lambda a, b: a + b
  4. ret = f1(1, 2)
  5. print(ret)

time模块

在Python中,通常有这几种方式表示时间:时间戳、格式化的时间字符串、元组(struct_time 共九种元素)。由于Python的time模块主要是调用C库实现的,所以在不同的平台可能会有所不同。
时间戳(timestamp)的方式:时间戳表示是从1970年1月1号 00:00:00开始到现在按秒计算的偏移量。查看一下type(time.time())的返回值类型,可以看出是float类型。返回时间戳的函数主要有time()、clock()等。
秒级时间戳:10位
毫秒级时间戳:13位
微秒级时间戳:16位
UTC(世界协调时),就是格林威治天文时间,也是世界标准时间。在中国为UTC+8。DST夏令时。
元组方式:struct_time元组共有9个元素,返回struct_time的函数主要有gmtime(),localtime(),strptime()。
时间元组就是一个用于表示时间格式的元组数据而已,他是time模块操作时间的主要方式。
(tm_year=2017, tm_mon=7, tm_mday=4, tm_hour=9, tm_min=4, tm_sec=21, tm_wday=1, tm_yday=185, tm_isdst=0)
格式:(年,月,日,时,分,秒,周几,一年中的第几天,是否是夏令时)

索引(Index) 属性(Attribute) 值(Values)
0 tm_year(年) 比如2011
1 tm_mon(月) 1 - 12
2 tm_mday(日) 1 - 31
3 tm_hour(时) 0 - 23
4 tm_min(分) 0 - 59
5 tm_sec(秒) 0 - 61
6 tm_wday(weekday) 0 - 6(0表示周日)
7 tm_yday(一年中的第几天) 1 - 366
8 tm_isdst(是否是夏令时) 默认为-1

[

](https://blog.csdn.net/SeeTheWorld518/article/details/48314501)

1.时间戳

  1. import time
  2. t = time.time()
  3. print(t) # 原始时间数据
  4. print(int(t)) # 秒级时间戳
  5. print(int(t * 1000)) # 毫秒级时间戳
  6. print(int(t * 1000000)) # 微秒级时间戳

image.png

2.time.struct_time()

在python中的time模块中定义了一个叫struct_time的元组,是用来构建时间对象的

3.time.localtime( [secs] )

将一个时间戳转换为当前时区的struct_time,即时间数组格式的时间
参数:
sec – 转换为time.struct_time类型的对象的秒数
如果secs参数未提供,则以当前时间为准(即会默认调用time.time())。
未给定参数和指定参数:

  1. import time
  2. print(time.localtime())
  3. print(time.localtime(5544655621))

image.png

4.time.gmtime( [secs] )

将一个时间戳转换为UTC时区的struct_time
time.gmtime() 函数将一个时间戳转换为UTC时区(0时区)的struct_time,可选的参数sec表示从1970-1-1 00:00:00以来的秒数。其默认值为time.time(),函数返回time.struct_time类型的对象。(struct_time是在time模块中定义的表示时间的对象)。
如果secs参数未提供,则以当前时间为准。
参数:
sec – 转换为time.struct_time类型的对象的秒数

  1. import time
  2. print(time.gmtime())
  3. print(time.gmtime(5544655621))

image.png

5.time.mktime( t )

将一个struct_time转化为时间戳。它接收struct_time对象作为参数,返回用秒数表示时间的浮点数
t – 结构化的时间或者完整的9位元组元素

  1. import time
  2. print(time.mktime(time.localtime()))

image.png

6.time.strftime( format [, t] )

返回字符串表示的当地时间。
把一个代表时间的元组或者struct_time(如由time.localtime()和time.gmtime()返回)转化为格式化的时间字符串,格式由参数format决定。如果未指定,将传入time.localtime()。
如果元组中任何一个元素越界,就会抛出ValueError的异常。函数返回的是一个可读表示的本地时间的字符串。

  • format:格式化字符串
  • t :可选的参数是一个struct_time对象

时间字符串支持的格式符号:(区分大小写)

格式 含义 备注
%a 本地(locale)简化星期名称
%A 本地完整星期名称
%b 本地简化月份名称
%B 本地完整月份名称
%c 本地相应的日期和时间表示
%d 一个月中的第几天(01 - 31)
%H 一天中的第几个小时(24小时制,00 - 23)
%I 第几个小时(12小时制,01 - 12)
%j 一年中的第几天(001 - 366)
%m 月份(01 - 12)
%M 分钟数(00 - 59)
%p 本地am或者pm的相应符
%S 秒(01 - 61)
%U 一年中的星期数。(00 - 53星期天是一个星期的开始。)第一个星期天之前的所有天数都放在第0周。
%w 一个星期中的第几天(0 - 6,0是星期天)
%W 和%U基本相同,不同的是%W以星期一为一个星期的开始。
%x 本地相应日期
%X 本地相应时间
%y 去掉世纪的年份(00 - 99)
%Y 完整的年份
%Z 时区的名字(如果不存在为空字符)
%% ‘%’字符
  1. import time
  2. print(time.strftime('%Y-%m-%d %H:%M:%S'))
  3. print(time.strftime('%Y'))

image.png

7.time.strptime( string[,format] )

将格式字符串转化成struct_time.
该函数是time.strftime()函数的逆操作。time strptime() 函数根据指定的格式把一个时间字符串解析为时间元组。所以函数返回的是struct_time对象。
参数:
string :时间字符串
format:格式化字符串

  1. stime = "2021-09-18 16:56:20"
  2. ret = time.strptime(stime,'%Y-%m-%d %H:%M:%S')
  3. print(ret)

image.png

总结:
格式化时间转时间戳,

  1. import time
  2. def str_to_timestamp(s=None, format="%Y-%m-%d %H:%M:%S"):
  3. '''
  4. :param s: 格式化好的时间,比如2021-9-18 17:06:32
  5. :param format: 时间格式 %Y-%m-%d %H:%M:%S
  6. :return: 返回的是一个时间戳,如果不传s,默认返回当前时间戳
  7. '''
  8. if s:
  9. time_tuple = time.strptime(s, format)
  10. return int(time.mktime(time_tuple))
  11. return int(time.time())
  12. def timestamp_to_str(timestame=None, format="%Y-%m-%d %H:%M:%S"):
  13. '''
  14. :param timestame: 时间戳
  15. :param format: 时间格式 %Y-%m-%d %H:%M:%S
  16. :return: 返回的是格式化好的时间,如果不传时间戳,那么返回当前的时间
  17. '''
  18. if timestame:
  19. time_tuple = time.localtime(timestame)
  20. return time.strftime(format, time_tuple)
  21. return time.strftime(format)