Python 学习之 --- 语法部分(函数)

16 篇文章 0 订阅
13 篇文章 0 订阅


1. 什么是函数

  • 函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段。
  • 函数能提高应用的模块性,和代码的重复利用率。你已经知道 Python 提供了许多内建函数,比如 print()。但你也可以自己创建函数,这被叫做用户自定义函数。

2. 函数的定义

Python 使用 def 关键字定义函数,语法格式如下:

def functionname( parameters ):
   "函数_文档字符串"
   function_suite
   return [expression]

定义函数的规则:

  • 函数代码块以 def 关键词开头,后接函数标识符名称和圆括号()。
  • 任何传入参数和自变量必须放在圆括号中间。圆括号之间可以用于定义参数。
  • 函数的第一行语句可以选择性地使用文档字符串—用于存放函数说明。
  • 函数内容以冒号起始,并且缩进。
  • return [表达式] 结束函数,选择性地返回一个值给调用方。不带表达式的 return 相当于返回 None。

不带返回值的函数

def function():
    print("*")
    print("* *")
    print("* * *")
    print("* * * *")
function()		#调用函数

# 结果
*
* *
* * *
* * * *

带返回值的函数

def function():
    print("***")
    return 1
function()

# 结果
***
//有返回值,如果只是单纯的调用,返回的还是函数的过程,return 的值没有意义。
------------------------------------
def function():
    print("***")
    return 1
# function()
print(function())

# 结果
***
1

3. 函数的调用

函数的调用有两种情况:

  • 在函数当前文件调用
  • 在其他文件调用函数

当前文件调用:

//当前文件调用,在函数下面输入函数名,传对应参数即可
def function(a,b):
    print(a+b)
function(1,2)

# 结果
3

不同文件调用:

//不同文件调用需要先导入 {from filedir import funcname/* ("*"代表该文件的所有函数)}
# 例如:我在 2.py 想要调用 test 包里面的 1.py 的函数
--- 1.py 函数为:
def function(a,b):	#像 a,b 这类不确定的参数一般叫做形参
    print(a+b)
function(1,2)		# 1,2 这种具体的参数叫做实参 

--- 2.py 调用 1 中的 function 函数
from test.1 import function
function

# 结果
3

4. 函数的参数

4.1 参数的传递

  • 在 python 中,类型属于对象,变量是没有类型的。
  • 在 python 中,strings, tuples, 和 numbers 是不可更改的对象,而 list, dict 等则是可以修改的对象。
  • python 中一切都是对象,严格意义我们不能说值传递还是引用传递,我们应该说传不可变对象和传可变对象。
# 这种就是参数的传递
def function(a,b):
    print(a+b)
function(1,2)

python 函数的参数传递两种类型:

  • 不可变类型:类似 c++ 的值传递,如整数、字符串、元组。如 fun(a),传递的只是 a 的值,没有影响 a 对象本身。比如在 fun(a) 内部修改 a 的值,只是修改另一个复制的对象,不会影响 a 本身。

  • 可变类型:类似 c++ 的引用传递,如列表,字典。如 fun(la),则是将 la 真正的传过去,修改后 fun 外部的 la 也会受影响。

4.2 默认参数

  • 定义函数时,可以给函数的参数指定默认值,这个被指定默认值的参数被称为默认参数。
  • 带有默认值的参数一定要位于参数列表的末尾。否则程序会报错。
def func(name,age=35):
    print("name:",name)
    print("age:",age)
func(name="miki")
func(age=9,name="miki")

# 结果
name: miki
age: 35
name: miki
age: 9
# 第一个 func() 中给 name 进行了赋值,age 是 func 函数自己定义的
# 第二个 func() 中给两个变量都进行了赋值

4.3 不定长参数

  • 若希望函数被调用时能够传入比定义时更多的参数,可以在定义函数时使用不定长参数。

语法:

def 函数名([formal_args,] *args, **kwargs):
    "函数_文档字符串"
    函数体、
    return 表达式
> 加星号 * 的参数 args 会以元组的形式存放未命名的参数。
>** 的参数 kwargs 会以字典的形式存放命名的参数,即形如 key=value 的参数。

示例:

def test(a,b,*args):
    print(a)
    print(b)
    print(args)
test(11,22)

# 结果
11
22
()	# *.args 以元组形式存放参数,该函数元组无元素
--------------------------------------
def test(a,b,*args):
    print(a)
    print(b)
    print(args)
test(11,22,33,44,55)

# 结果
11
22
(33, 44, 55)	# 该函数元组传入了三个元素
--------------------------------------
def test(a,b,*args,**kwargs):
    print(a)
    print(b)
    print(args)
    print(kwargs)
test(11,22,33,44,55,66,77,88,99)

# 结果
11
22
(33, 44, 55, 66, 77, 88, 99)
{}		# **kwargs 存放键值对形式的元素,该函数字典为空
--------------------------------------
def test(a,b,*args,**kwargs):
    print(a)
    print(b)
    print(args)
    print(kwargs)
test(11, 22, 33, 44, 55, 66, 77, m=88, n=99)

# 结果
11
22
(33, 44, 55, 66, 77)
{'m': 88, 'n': 99}		# test() 语句中可以看出有两个键值对

5. 函数的返回值

  • return [表达式] 语句退出函数,选择性地向调用方返回一个表达式。不带参数值的 return 语句返回 None。
  • 程序运行到所遇到的第一个 return 即返回(退出 def 块),不会再运行第二个 return。(不包括判断语句)
  • 要返回两个数值,写成一行即可。
def a(x,y):
    if x == y:
        return (x,y)
  
print(a(3,3))	# 结果:(3,3)
----------------------------
def test_return(x):
    if x > 0:
        return x
    else:
        return 0
print(test_return(5))	# 结果:5
----------------------------
def gcd(a,b):
     if a%b == 0:
         return b
     else:
         gcd(b,a%b)
print(gcd(4,2))		# 结果:2

6. 函数的四种类型

根据函数的参数和返回值,函数可以分为四种类型:

  • 无参数,无返回值的函数
def print_menu():
    print('-----点菜系统-----')
    print('1.羊肉涮锅')
    print('2.牛肉涮锅')
    print('3.猪肉涮锅')
print_menu()
  • 无参数,有返回值的函数
def get_tem():
    return 24
tem = get_tem()
print("当前温度为:",tem)
  • 有参数,无返回值的函数
def test(x,y):
    c = x + y
    print(c)

test(2,1)
  • 有参数,有返回值的函数
def test(x,y):
    c = x + y
    return(c)

b = test(3,4)
print(b)

7. 函数的嵌套调用

  • 函数有可见范围,这就是作用域的概念。内部函数不能被外部直接使用,会抛 NameError 异常。
  • 全局作用域(global):在整个程序运行环境中都可见。
  • 局部作用域:在函数、类等内部可见;局部变量使用范围不能超过其所在的局部作用域。
  • 函数有此概念,变量也有。
def outer():
    for i in range(3):
        i += 1
    def inner():
        for j in range(3):
            j += 1
        print("这是内函数")
    inner()
    print("这是外函数")
inner()		# 该语句无法执行,内部循环无法被外部循环调用
outer()

-----------------------------
def f1():   # 1
    def f2():   # 3
        print('from f2')    # 5
        def f3():   # 6
            print('from f3')    #8
        f3()    # 7
    f2()    # 4
f1()    # 2
# 结果
from f2
from f3

8. 变量的作用域

Python 中,程序的变量并不是在哪个位置都可以访问的,访问权限决定于这个变量是在哪里赋值的,看如下示例:

a = 10
def test():
    a = 20
    print('a 的值为 %d'%a)
test()	# 结果:20
//我们调用的 test() 函数执行的内部运算,外部 a 的值影响不到内部

LEGB 原则:变量的作用域决定了在哪一部分程序可以访问哪个特定的变量名称。Python的作用域一共有 4 种。

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

Python 中变量是按照 L -》E -》G -》B 的顺序查找的。
Python 在查找变量的时候会优先去函数内作用域中查找,若没有找到便会到嵌套函数作用域中查找,再找不到就去全局作用域中查找,最后再去内建作用域中查找。

局部变量:

  • 所谓局部变量,就是在函数内部定义的变量。
  • 局部变量的作用域是函数内部,说明它只在定义它的函数中有效,一旦函数结束就会消失。

全局变量:

  • 定义在函数外的变量拥有全局作用域。
  • 全局变量可以在整个程序范围内访问。
  • 如果出现全局变量和局部变量名字相同的情况,则在函数中优先访问局部变量。

global 关键字

  • global 关键字用来在函数或其他局部作用域中使用全局变量。
a = 100
def test():
    global a
    a += 100
    print(a)

test()	# 结果:200
// 我们通过 global 关键字在 test() 函数内部引用了外部变量 a 的值。

nonlocal 关键字

# nonlocal 关键字用来在函数或其他作用域中使用外层(非全局)变量。
def func():
    count = 1
    def func_in():
        nonlocal count
        count = count + 1
    func_in()
    print(count)

func()	# 结果:2
---------------------------
def work():
    x = 0
    def new_work():
        nonlocal x
        x = x + 3
        return x
    return new_work()

print(work())	# 结果:3
---------------------------
def dosometing():
    a =25
    def add(x):
        nonlocal a
        a=a+x
        return a
    return add
f=dosometing()
print(f(5))		# 结果:30
print(f(5))		# 结果:35
print(f(5))		# 结果:40

9. 递归函数

计算 1 到 100 之间相加之和:

# 循环
def sum_cycle(n):
    sum = 0
    for i in range(1,n+1) :
        sum += i
    print(sum)

sum_cycle(100)

# 递归
def sum_recu(n):
    if n > 0:
        return n + sum_recu(n - 1)
    else:
        return 0

sum_recu(100)
sum = sum_recu(100)
print(sum)

计算阶乘:

def fact(n):
    if n == 1:
        return 1
    return n * fact(n - 1)
print(fact(5))      # 输出结果: 120
print(fact(1))      # 输出结果: 1
print(fact(3))      # 输出结果:6

10. 匿名函数

与普通函数相比,匿名函数有很多不同的地方:

  • 普通函数在定义时有名称,而匿名函数没有名称。
  • 普通函数的函数体中包含有多条语句,而匿名函数的函数体只能是一个表达式。
  • 普通函数可以实现比较复杂的功能,而匿名函数可实现的功能比较简单。

格式:

lambda [arg1 [,arg2......argn]]:expression
//[arg1 [,arg2,...argn]] 表示函数的参数,"expression" 表示表达式

示例:

sum = lambda a, b:a + b
print("运行结果:",sum(10,20))	# 30
print("运行结果:",sum(20,20))	# 40

11. 时间函数

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

  • 时间戳
  • 格式化的时间字符串
  • 时间元组(struct_time)

https://www.runoob.com/python/python-date-time.html

11.1 时间戳

时间戳表示从 1970 年 1 月 1 日 00:00:00 开始按秒计算的偏移量。

import time;  # 引入 time 模块
ticks = time.time()
print("当前时间戳为:", ticks)

# 结果
当前时间戳为: 1642646483.0328028

11.2 格式化的时间字符串

我们可以使用 time 模块的 strftime 方法来格式化日期。

import time
# 格式化成 2022-01-20 10:43:00 形式
print(time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()))

# 结果
2022-01-20 10:43:00

常用格式化符号:(具体见上面链接)
在这里插入图片描述
在这里插入图片描述

11.3 时间元组

返回时间元组的函数主要有 gmtime()、localtime() 和 strptime()。时间元组共有 9 个字段:

序号属性
0tm_year2008
1tm_mon1 到 12
2tm_mday1 到 31
3tm_hour0 到 23
4tm_min0 到 59
5tm_sec0 到 61 (60或61 是闰秒)
6tm_wday0到6 (0是周一)
7tm_yday1 到 366(儒略历)
8tm_isdst-1, 0, 1, -1是决定是否为夏令时的旗帜

Time 模块包含了以下内置函数,既有时间处理的,也有转换时间格式的:

序号函数及描述
1time.altzone 返回格林威治西部的夏令时地区的偏移秒数。如果该地区在格林威治东部会返回负值(如西欧,包括英国)。对夏令时启用地区才能使用。
2[time.asctime(tupletime]) 接受时间元组并返回一个可读的形式为"Tue Dec 11 18:07:14 2008"(2008年12月11日 周二18时07分14秒)的24个字符的字符串。
3time.clock( ) 用以浮点数计算的秒数返回当前的CPU时间。用来衡量不同程序的耗时,比time.time()更有用。
4[time.ctime(secs]) 作用相当于asctime(localtime(secs)),未给参数相当于asctime()
5[time.gmtime(secs]) 接收时间戳(1970纪元后经过的浮点秒数)并返回格林威治天文时间下的时间元组t。注:t.tm_isdst始终为0
6[time.localtime(secs]) 接收时间戳(1970纪元后经过的浮点秒数)并返回当地时间下的时间元组t(t.tm_isdst可取0或1,取决于当地当时是不是夏令时)。
7time.mktime(tupletime) 接受时间元组并返回时间戳(1970纪元后经过的浮点秒数)。
8time.sleep(secs) 推迟调用线程的运行,secs指秒数。
9[time.strftime(fmt,tupletime]) 接收以时间元组,并返回以可读字符串表示的当地时间,格式由fmt决定。
10time.strptime(str,fmt=’%a %b %d %H:%M:%S %Y’) 根据fmt的格式把一个时间字符串解析为时间元组。
11time.time( ) 返回当前时间的时间戳(1970纪元后经过的浮点秒数)。
12time.tzset() 根据环境变量TZ重新初始化时间相关设置。

Time 模块包含了以下 2 个非常重要的属性:

序号属性及描述
1time.timezone 属性 time.timezone 是当地时区(未启动夏令时)距离格林威治的偏移秒数(>0,美洲<=0大部分欧洲,亚洲,非洲)。
2time.tzname 属性time.tzname包含一对根据情况的不同而不同的字符串,分别是带夏令时的本地时区名称,和不带的。

11.4 日历函数

此模块的函数都是日历相关的,例如打印某月的字符月历。星期一是默认的每周第一天,星期天是默认的最后一天。更改设置需调用 calendar.setfirstweekday() 函数。模块包含了以下内置函数:

序号函数及描述
1calendar.calendar(year,w=2,l=1,c=6) 返回一个多行字符串格式的year年年历,3个月一行,间隔距离为c。 每日宽度间隔为w字符。每行长度为21* W+18+2* C。l是每星期行数。
2calendar.firstweekday( ) 返回当前每周起始日期的设置。默认情况下,首次载入 calendar 模块时返回 0,即星期一。
3calendar.isleap(year) 是闰年返回 True,否则为 False。>>> import calendar >>> print(calendar.isleap(2000)) True >>> print(calendar.isleap(1900)) 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=2,l=1,c=6)
9calendar.prmonth(year,month,w=2,l=1) 相当于 print calendar.month(year,month,w=2,l=1)
10calendar.setfirstweekday(weekday) 设置每周的起始日期码。0(星期一)到6(星期日)。
11calendar.timegm(tupletime) 和time.gmtime相反:接受一个时间元组形式,返回该时刻的时间戳(1970纪元后经过的浮点秒数)。
12calendar.weekday(year,month,day) 返回给定日期的日期码。0(星期一)到6(星期日)。月份为 1(一月) 到 12(12月)。

在 Python 中,其他处理日期和时间的模块还有:

  • datetime 模块
  • pytz 模块
  • dateutil 模块

12. 随机数函数

  • random.random()
  • 返回 0 与 1 之间的随机浮点数 N,范围为 0<=N<1.0。
import random

# 生成一个随机数
print("random():", random.random())
# 生成第二个随机数
print("random():", random.random())
  • random.uniform(a,b)
  • 返回 a 与 b 之间的随机浮点数 N,范围为 [a,b]。如果 a 的值小于 b 的值,则生成的随机浮点数 N 的取值范围为 a<=N<=b;如果 a 的值大于 b 的值,则生成的随机浮点数 N 的取值范围为 b<=N<=a。
import random

print("random:", random.uniform(50, 100))
print("random:", random.uniform(100, 50))
  • random.randint(a,b)
  • 返回一个随机的整数 N,N 的取值范围为 a<=N<=b。需要注意的是,a 和 b 的取值必须为整数,并且 a 的值一定要小于 b 的值。
import random

# 生成一个随机数N,N的取值范围为12<=N<=20
print(random.randint(12, 20))

# 生成的随机数为N,N 的结果永远为20
print(random.randint(20, 20))

# print(random.randint(20, 10))
# 该语句是错误语句,下限a必须小于上线b
  • random.randrange([start], stop[, step])
  • 返回指定递增基数集合中的一个随机数,基数默认值为 1。其中,start 参数用于指定范围内的开始值,其包含在范围内;end 参数用于指定范围内的结束值。其不包含在范围内;sep 表示递增基数上述这些参数必须为整数。
import random

print(random.randrange(10, 100, 2))
  • random.choice(sequence)
  • 从 sequence 中返回一个随机数,其中 sequence 参数可以是列表、元组或字符串。若 sequence 为空,则会引发 IndexError 异常。
import random

mylist = ["apple", "banana", "cherry"]
print(random.choice(mylist))
  • random.shuffle(X[,random])
  • 用于将列表中的元素打乱顺序,俗称 “洗牌”。
import random

demo_list = ["python", "is", "powerful", "simpel", "and so on..."]
random.shuffle(demo_list)
print(demo_list)
  • random.sample(sequence, K)
  • 从指定序列中随机获取 K 个元素作为一个片段返回,sample 函数不会修改原有序列。
import random

list_num =[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

# 定义slice为随机在list_num中获取的3个元素
slice = random.sample(list_num, 3)
print(slice)

# 原有的序列没有发生改变
print(list_num)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Lambda表达式是Python中的一种匿名函数,它可以在一行代码中定义一个函数。Lambda表达式通常用于简单的函数,它们可以作为参数传递给其他函数或作为返回值返回。 Lambda表达式的语法如下: lambda 参数列表: 表达式 其中,参数列表是用逗号分隔的形式参数,表达式是函数的返回值。 例如,下面的代码定义了一个简单的Lambda函数: f = lambda x: x * x 这个函数接受一个参数x,并返回x的平方。我们可以像调用普通函数一样调用它: print(f(5)) # 输出25 Lambda表达式还可以用于定义匿名函数,例如: g = lambda x, y: x + y 这个函数接受两个参数x和y,并返回它们的和。我们可以像调用普通函数一样调用它: print(g(2, 3)) # 输出5 总之,Lambda表达式是Python中一种非常方便的函数定义方式,它可以让我们更加简洁地编写代码。 ### 回答2: Lambda表达式是Python函数中的一种简洁方式,它可以定义在一行内的匿名函数。Lambda使用关键字“lambda”来表示,后面跟随一个或多个参数,分隔符为逗号,然后是冒号和一个表达式。返回值是该表达式的结果。 Lambda表达式的基本语法如下: lambda arguments: expression 其中arguments参数可以是0个、1个或多个参数,expression表达式是lambda函数的返回值。 Lambda表达式的使用场景比较广泛,通常用于函数式编程、过滤器(filter)、映射器(map)、排序器(sort)等操作中。 例如,我们可以使用lambda表达式来定义一个简单的函数: x = lambda a : a + 10 print(x(10)) # 输出结果为20 上述例子中,lambda表达式定义了一个参数“a”,表达式为“a+10”,即函数返回值为传入参数a加上10。 当需要对一个列表中的元素进行操作时,我们可以使用map函数结合lambda表达式来实现: lst = [1, 3, 5, 7] result_lst = list(map(lambda x:x*2, lst)) print(result_lst) # 输出结果为[2, 6, 10, 14] 上述例子中,lambda表达式定义了一个参数“x”,表达式为“x*2”,即将列表中的每个元素乘以2。map函数将该lambda表达式应用于lst中的每个元素,返回一个新的列表。 Lambda表达式比较适用于简单的函数定义和一些简单的操作,但对于较为复杂的任务或需要频繁使用的代码,建议还是使用函数进行定义。 ### 回答3: Python是一种广泛使用的编程语言,而函数Python编程的重要部分。在Python中,函数是一个特殊的代码块,可以接受一些输入(参数),并在执行一些操作后返回输出。其中,lambda表达式是定义函数的一种不同方式。 lambda表达式也被称为匿名函数,因为它们可以定义一个没有名称的函数。与普通函数不同,lambda函数只能包含一个表达式,而不是一条语句块。语法如下: lambda 参数: 表达式 下面是一个简单的例子: add = lambda x, y: x + y print(add(2, 3)) # 输出5 在这个例子中,lambda函数的定义是add = lambda x, y: x + y,其中参数是x和y,表达式是x + y。定义后,我们可以像使用普通函数一样使用它。 lambda函数有许多用途。其中之一是作为其他函数的参数,例如在sort()函数中进行排序。例如,我们可以使用lambda函数按照列表中每个元素的第二个元素进行排序。实现方式如下: a = [(1, 2), (4, 1), (9, 10), (13, -3)] a.sort(key=lambda x: x[1]) # 按每个元组的第二个元素进行排序 print(a) 输出结果为:[(13, -3), (4, 1), (1, 2), (9, 10)] 总之,Lambda表达式是Python语言中一个十分有用的特性,它允许我们创建匿名函数,使代码变得更加简洁和易读。在实际编程中,可以将其用于诸如函数参数传递、过滤器、排序等许多编程任务中。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值