Python旅途——函数(1)
函数
简介
到目前为止,我们一直所接触的都是属于面向过程编程,这样的代码会降低代码的可读性,因此引入了函数式编程,在后面我们还会学到面向对象编程。
函数式编程
函数本质:将N行代码拿到别处,并给他起个名字,以后通过名字就可以找到这段代码并执行。
应用场景:代码重复执行,代码量特别多超过一屏,可以选择函数进行代码的分割
面向对象编程
- 对函数进行分类和封装,让开发“更快更好更强...”
函数基本结构:
def 函数名():
# 函数内容
函数名() #执行函数
注:如果函数没被调用,则内部代码永不执行
参数
1.参数的使用
- 参数调用可以是任意的类型,同样的return返回值也可以是任意类型
2.强制转换
v1 = [1,2,3,4]
v2 = tuple(v1)
v1 = (1,2,3,4)
v2 = list(v1)
3.位置传参(调用函数,并传入参数)
def func(a,b,c):
pass
func(1,2,3)
4. 关键字传参
def func(a,b,c):
pass
func(k1 = 1,k2 = 2,k3 = 3)
- 位置参数和关键字参数可以混合使用,位置参数一定在前面,关键字参数一定在后面。
5. 默认参数
def func(a,b = 3):
pass
func(11) # 可以只写一个值,则另外一个默认就是3
func(2,3) # 也可以写两个值,这样就是把2赋值给a,把3赋值给b,b不在取默认值
6. 万能参数
*args :不支持关键字传参,只能传位置参数,可以接收n个位置参数,并且将参数转化为元组
调用函数无 *:
def func(*args):
print(args)
func(1,2,3...) # 不支持关键字传参,只能传位置参数,可以接收n个位置参数,并且将参数转化为元组
调用函数有 *:
def func(*args):
print(args)
func(*(1,2,3,4))
func(*[1,2,3,4])
**kwargs :不支持位置传参,只能关键字传参,可以接收n个关键字参数,并且转化为字典
调用函数无**:
def func(**kwargs):
print(kwargs)
func(k1=1,k2=2,k3=3...) # 不支持位置传参,只能关键字传参,可以接收n个关键字参数,并且转化为字典
调用函数有**:
def func(**kwargs):
print(kwargs)
func(**{'k1':'alex','k2':'eric'}) # kwargs={'k1':'v2','k2':'v2'}
- 综合应用 :*args + **kwargs = 无敌
def func(*args,**kwargs):
print(*args,**kwargs)
func(1,2,3,k1=1,k2=3,k3=5)
func(*[1,2,3],k1=2,k5=9,k19=999)
func(*[1,2,3],**{'k1':1,'k2':3})
func(111,222,*[1,2,3],k11='alex',**{'k1':1,'k2':3})
7. 参数相关知识重点
定义函数:
# 第一种
def func(a,b):
pass
func(1,2)
# 第二种
def func(a,b=None):
pass
func(1)
# 第三种
def func(*args,**kwargs):
pass
func(1,k1=1)
调用函数
- 位置参数在前
- 关键参数在后
def get_list_first_data(aaa): # aaa叫形式参数(形参)
v = [11,22,33,44]
print(v[aaa])
get_list_first_data(1) # 2/2/1调用函数时传递叫:实际参数(实参)
练习:
# 1. 请写一个函数,函数计算列表 info = [11,22,33,44,55] 中所有元素的和。
def value(x):
var = 0
for i in x:
var += i
print(var)
v1 = value([11,22,33,44,55])
# 2. 请写一个函数,函数将两个列表拼接起来。
def value(x,y):
list1 = []
list1.extend(x)
list1.extend(y)
print(list1)
value([1,2,3],['alex','eric'])
# 3. 计算一个列表的长度
def length(x):
var = 0
for i in x:
var += 1
print(var)
length([1,2,3,4,5])
返回值:
- 函数是一个功能块,该功能到底执行成功与否,需要通过返回值来告知调用者。
1.数据类型中的方法到底有没有返回值?
- 有返回值
- 无返回值
- 有返回+修改数据
2.一般常用的需要记住的:
- str
- strip 返回str
- split 返回str
- replace 返回str
- upper 返回str
- lower 返回str
- join 返回str
- list
- append 无返回值
- insert 无返回值
- pop 返回要删除的数据
- remove 无返回值
- find/index 返回索引位置
- dict
- get 有返回值
- keys 有返回值
- values 有返回值
- items 有返回值
- 基本格式
def func(arg):
# ....
return 9 # 返回值为9 默认:return None
val = func('adsfadsf')
- 下面是一些简单的练习题来深入理解返回值的概念
# 练习
1.写函数,计算一个列表中有多少个数字,打印: 列表中有%s个数字。 提示:type('x') == int 判断是否是数字。
def num(list):
var = 0
for i in list:
if type(i) == int:
var += 1
return var
v1 = num(['sdf',1,2,3,'sdf'])
print(v1)
# 2. 写函数,计算一个列表中偶数索引位置的数据构造成另外一个列表,并返回。
def double(list):
var = []
for i in range(0,len(list)) :
if i%2 == 0:
var.append(list[i])
return var
v1 = double([1,2,3,4,5,6])
print(v1)
# 3. 读取文件,将文件的内容构造成指定格式的数据,并返回。
"""
a.log文件
alex|123|18
eric|uiuf|19
...
目标结构:
a. ["alex|123|18","eric|uiuf|19"] 并返回。
b. [['alex','123','18'],['eric','uiuf','19']]
c. [
{'name':'alex','pwd':'123','age':'18'},
{'name':'eric','pwd':'uiuf','age':'19'},
]
"""
a:
def var():
list = []
with open('a.log',mode='r',encoding='utf-8') as f:
for line in f:
list.append(line)
return list
v1 = var()
print(v1)
b:
def var():
list = []
with open('a.log',mode='r',encoding='utf-8') as f:
for line in f:
line = line.strip()
new_line = line.split("|")
list.append(new_line)
return list
v1 = var()
print(v1)
c:
def var():
list = []
with open('a.log',mode='r',encoding='utf-8') as f:
for line in f:
line = line.strip()
new_line = line.split("|")
a,b,c = new_line
info = {}
info['name'] = a
info['pwd'] = b
info['age'] = c
list.append(info)
return list
v1 = var()
print(v1)
作用域
Python中:
- py文件 为全局作用域
- 函数为局部作用域
a = 1
def s1():
x1 = 666
print(x1)
print(a)
print(b)
b = 2
print(a)
s1()
a = 88888
def s2():
print(a,b)
s1()
s2() #打印结果 1,666,1,2,8888,2,666,8888,2
总结:
- 一个函数是一个作用域
- 作用域中查找数据规则:优先在自己的作用域中寻找,自己的作用域没有的话,就去父级的作用域里面找,直到找完全局作用域
练习题
!/usr/bin/env python
-*- coding:utf-8 -*- x = 10
def func():
x = 9
print(x)
def x1():
x = 999
print(x)
func() x = 10
def func():
x = 9
print(x)
def x1():
x = 999
print(x)
x1()
func() # 9,999 x = 10
def func():
x = 9
print(x)
def x1():
x = 999
print(x)
print(x)
x1()
func() #9,9,999 x = 10
def func():
x = 8
print(x)
def x1():
x = 999
print(x)
x1()
print(x)
func() #8,999,8 x = 10
def func():
x = 8
print(x)
def x1():
print(x)
x1()
print(x)
func() # 8,8,8 x = 10
def func():
x = 8
print(x)
def x1():
print(x)
x = 9
x1()
x = 10
print(x)
func() # 8,9,10 x = 10
def func():
x = 8
print(x)
def x1():
print(x) x1()
x = 9
x1()
x = 10
print(x)
func() # 8,8,9,10-
- 子作用域中只能找到父级中的值,默认无法重新为父级的变量重新赋值
name = 'dali'
def func():
name = 'alex' # 在自己作用域再创建一个这样的值。
print(name)
func()
print(name) # #####################
name = [1,2,43]
def func():
name.append(999)
print(name)
func()
print(name) # ###################### 如果非要对全局的变量进行赋值
# 示例一
name = ["大栗",'alex']
def func():
global name
name = '我'
func()
print(name)
# 示例一
name = "大栗"
def func():
name = 'alex'
def inner():
global name
name = 999
inner()
print(name)
func()
print(name) # #####################
name = "大栗"
def func():
name = 'alex'
def inner():
global name
name = 999
inner()
print(name)
func()
print(name)
# #####################
name = "大栗"
def func():
name = 'alex'
def inner():
nonlocal name # 找到上一级的name
name = 999
inner()
print(name)
func()
print(name)- 重新赋值
- global:找到全局变量并可以对它进行重新赋值
- nonlocal:找到上一级的变量,并对它进行修改
以后全局变量都要大写,局部可以小写
总结
主要对于函数的参数、返回值、以及函数的作用域做了简单的介绍和分享。
Python旅途——函数(1)的更多相关文章
- Python旅途——函数的递归和栈的使用
Python--函数之递归.栈的使用 今天主要和大家分享函数的递归,同时引入一个新的概念--栈 1.递归 1.定义 函数的递归指的就是函数自己调用自己,什么是函数自己调用自己呢?我们来看一个栗子: 这 ...
- python的函数
函数一词起源于数学,但是在编程中的函数和数学中的有很大不同.编程中的函数式组织好的,可重复使用的,用于实现单一功能或相关联功能的代码块. 我们在学习过程中已经使用过一些python内建的函数,如pri ...
- python strip()函数 介绍
python strip()函数 介绍,需要的朋友可以参考一下 函数原型 声明:s为字符串,rm为要删除的字符序列 s.strip(rm) 删除s字符串中开头.结尾处,位于 rm删除 ...
- python split()函数
Python split()函数 函数原型: split([char][, num])默认用空格分割,参数char为分割字符,num为分割次数,即分割成(num+1)个字符串 1.按某一个字符分割. ...
- Python数学函数
1.Python数学函数 1.abs(x):取绝对值,内建函数 2.math.ceil(x):向上取整,在math模块中 3.cmp(x,y):如果 x < y ,返回-1:如果 x == y ...
- Python回调函数用法实例详解
本文实例讲述了Python回调函数用法.分享给大家供大家参考.具体分析如下: 一.百度百科上对回调函数的解释: 回调函数就是一个通过函数指针调用的函数.如果你把函数的指针(地址)作为参数传递给另一个函 ...
- Python之函数与变量
本节内容 函数介绍及其作用 函数的定义与调用 函数的参数说明 全局变量与局部变量 值传递和引用传递 一.函数的介绍及其作用 编程语言中的函数与数学中的函数是有区别的:数学中的函数有参数(输入),就会有 ...
- Python基础-函数篇
本节内容 1. 函数基本语法及特性 2. 参数与局部变量 3. 返回值 嵌套函数 4.递归 5.匿名函数 6.函数式编程介绍 7.高阶函数 8.内置函数 函数与函数式编程 1.面向对象: 华山派-- ...
- 【C++实现python字符串函数库】strip、lstrip、rstrip方法
[C++实现python字符串函数库]strip.lstrip.rstrip方法 这三个方法用于删除字符串首尾处指定的字符,默认删除空白符(包括'\n', '\r', '\t', ' '). s.st ...
随机推荐
- UVa 12186 Another Crisis 工人的请愿书
c表示某上司上报的最少请愿下属,k表示总下属c=0.01T*k=kT/100(0.01T*k是整数)c=[0.01T*k]+1=[kT/100]+1(0.01T*k不是整数) kT=100 c=1 k ...
- 关于MyBatis的两种写法
刚接触MyBatis是在Jike的视频中学习的,但是之后又发现和项目中的MyBatis的用法不太一致.上网找了好多资料,发现网上的教程分为两种写法: 第一种,是jike视频中的写法,写好map.xml ...
- memcached随笔练习
实验环境: RHEL 6.5 (已关闭selinux,iptables) 首先部署LNMP环境,该步骤采用源码编译安装 安装Nginx-1.8.0 准备软件包:nginx-1.8.0.tar.gz 下 ...
- 01.第一章_C++ Primer学习笔记_开始
1.2 初始输入输出 iostream库里面包含两个基础类型istream和ostream,分别表示输入流和输出流,一个流就是一个字符序列,从IO设备读出或者写入IO设备. 标准的输入输出对象 标准库 ...
- springboot 配置Ehcache
Ehcache的基本配置说明我就不说了.小编记录一下在springboot中使用Ehcache的使用方法. 第一步:在classpath下引入配置文件ehcache.xml 代码如下: <ehc ...
- json和php数组 格式的互相转换
$json_arr = array('WebName'=>'PHP网站开发教程网','WebSite'=>'http://www.jb51.net'); $php_json = json ...
- zoj3772Calculate the Function(矩阵+线段树)
链接 表达式类似于斐波那契 但是多了一个变量 不能用快速幂来解 不过可以用线段树进行维护 对于每一个点够一个2*2的矩阵 1 a[i] 1 0 这个矩阵应该不陌生 类似于构造斐波那契的那个数列 ...
- 【转】一篇文章,教你学会Git
一篇文章,教你学会Git 在日常工作中,经常会用到Git操作.但是对于新人来讲,刚上来对Git很陌生,操作起来也很懵逼.本篇文章主要针对刚开始接触Git的新人,理解Git的基本原理,掌握常用的一些命令 ...
- Eclipse 闪退/无法启动/一闪而过打解决办法
解决方法 删除文件:/.metadata/.plugins/org.eclipse.e4.workbench/workbench.xmi 经过实际应用真实有效.
- Linux PHP的运行模式
关系图 首先聊一下服务器,常见的web server类型有apache和nginx Apache工作模式 Apache的工作模式是Apache服务器在系统启动后,预先生成多个进程副本驻留在内存中,一旦 ...