python函数作用域包括局部变量和参数_【云计算】python变量的作用域:局部变量和全局变量...

本文主要向大家介绍了【云计算】python变量的作用域:局部变量和全局变量,通过具体的内容向大家展现,希望对大家学习云计算有所帮助。

变量定义以后,是有一定的使用范围,称之为变量的作用域。比如Java中,变量的使用范围是变量声明时所在的{}范围,而python的作用域对应的为同一个缩进。按着变量的使用范围给变量划分成如下两种:

1.全局变量:就

import java.util.ArrayList;

public class MyAVL, V> {

private class Node{

public K key;

public V value;

public Node left, right;

public int high;

public Node(K key, V value){

this.key = key;

this.value = value;

high=1;

left = null;

right = null;

}

}

//返回节点的高度标注

private int getHigh(Node node){

if(node ==null)

return 0;

return node.high;

}

private Node root;

private int size;

public MyAVL(){

root = null;

size = 0;

}

public int getSize(){

return size;

}

public boolean isEmpty(){

return size == 0;

}

// 向二分搜索树中添加新的元素(key, value)

public void add(K key, V value){

root = add(root, key, value);

}

// 向以node为根的二分搜索树中插入元素(key, value),递归算法

// 返回插入新节点后二分搜索树的根

private Node add(Node node, K key, V value){

if(node == null){

size ++;

return new Node(key, value);

}

if(key.compareTo(node.key) 

node.left = add(node.left, key, value);

else if(key.compareTo(node.key) > 0)

node.right = add(node.right, key, value);

else // key.compareTo(node.key) == 0

node.value = value;

//不论这个添加的点往那个子树上添加 都要更新高度标注 相等的话无影响

node.high = Math.max(getHigh(node.left),getHigh(node.right))+1;

//计算平衡因子并递归到根节点

int b = getB(node);

//LL 进行右旋转

if(b>1 && getB(node.left)>=0)//右旋转

return rightB(node);

//RR 左旋转

if (b

return leftB(node);

//LR 先对node.left进行左旋转 再对node右旋转

if(b>1 && getB(node.left)<0){

node.left=leftB(node.left);

return rightB(node);

}

//RL 先对右子树进行右旋转 再对node左旋转

if(b=0){

node.right=rightB(node.right);

return leftB(node);

}

return node;

}

//左旋转操作 插入节点 在右孩子的右孩子

private Node leftB(Node node){

Node down =node.right;

Node one = down.left;

down.left=node;

node.right=one;

//维护高度

node.high = Math.max(getHigh(node.left),getHigh(node.right))+1;

down.high = Math.max(getHigh(down.left),getHigh(node.right))+1;

return down;

}

//右旋转操作 插入点在左孩子的左节点

private Node rightB(Node node){

Node down=node.left;

Node one = down.right;

down.right=node;

node.left=one;

//维护高度

node.high = Math.max(getHigh(node.left),getHigh(node.right))+1;

down.high = Math.max(getHigh(down.left),getHigh(down.right))+1;

return down;

}

//方法 判断当前tree是不是二分搜索树 满足中大于左小于右

public boolean isBST(){

ArrayList list= new ArrayList<>();

isBST(root,list);

//遍历list判断是否有序

for(int i=1;i0)

return false;

return true;

}

//返回当前节点的 平衡因子

public int getB(Node node){

//不需要取绝对值,后期要判断左旋转还是右旋转

return getHigh(node.right)-getHigh(node.left);

}

//判断树是不是平衡树

public boolean isB(){

return isB(root);

}

private boolean isB(Node node){

//终止条件

if(node==null)

return true;

//判断当前节点 平衡因子

if(Math.abs(getB(node))>1)

return false;

//左右子孩子平衡因子

return isB(node.left)&&isB(node.right);

}

private void isBST(Node node,ArrayList list){

//递归遍历

if(node == null)

return;

isBST(node.left,list);

list.add(node.key);

isBST(node.right,list);

}

// 返回以node为根节点的二分搜索树中,key所在的节点

private Node getNode(Node node, K key){

if(node == null)

return null;

if(key.equals(node.key))

return node;

else if(key.compareTo(node.key) 

return getNode(node.left, key);

else // if(key.compareTo(node.key) > 0)

return getNode(node.right, key);

}

public boolean contains(K key){

return getNode(root, key) != null;

}

public V get(K key){

Node node = getNode(root, key);

return node == null null : node.value;

}

public void set(K key, V newValue){

Node node = getNode(root, key);

if(node == null)

throw new IllegalArgumentException(key + " doesn't exist!");

node.value = newValue;

}

// 返回以node为根的二分搜索树的最小值所在的节点

private Node minimum(Node node){

if(node.left == null)

return node;

return minimum(node.left);

}

// 删除掉以node为根的二分搜索树中的最小节点

// 返回删除节点后新的二分搜索树的根

private Node removeMin(Node node){

if(node.left == null){

Node rightNode = node.right;

node.right = null;

size --;

return rightNode;

}

node.left = removeMin(node.left);

return node;

}

// 从二分搜索树中删除键为key的节点

public V remove(K key){

Node node = getNode(root, key);

if(node != null){

root = remove(root, key);

return node.value;

}

return null;

}

private Node remove(Node node, K key){

if( node == null )

return null;

Node del;

if( key.compareTo(node.key) 

node.left = remove(node.left , key);

del= node;

}

else if(key.compareTo(node.key) > 0 ){

node.right = remove(node.right, key);

del = node;

}

else{ // key.compareTo(node.key) == 0

// 待删除节点左子树为空的情况

if(node.left == null){

Node rightNode = node.right;

node.right = null;

size --;

del = rightNode;

}

// 待删除节点右子树为空的情况

else if(node.right == null){

Node leftNode = node.left;

node.left = null;

size --;

del= leftNode;

}else{

// 待删除节点左右子树均不为空的情况

// 找到比待删除节点大的最小节点, 即待删除节点右子树的最小节点

// 用这个节点顶替待删除节点的位置

Node successor = minimum(node.right);

successor.right = remove(node.right,successor.key);

successor.left = node.left;

node.left = node.right = null;

del= successor;

}

}

if(del==null)

return null;

del.high = Math.max(getHigh(del.left),getHigh(del.right))+1;

//计算平衡因子并递归到根节点

int b = getB(del);

//LL 进行右旋转

if(b>1 && getB(del.left)>=0)//右旋转

return rightB(del);

//RR 左旋转

if (b

return leftB(del);

//LR 先对node.left进行左旋转 再对node右旋转

if(b>1 && getB(del.left)<0){

del.left=leftB(del.left);

return rightB(del);

}

//RL 先对右子树进行右旋转 再对node左旋转

if(b=0){

del.right=rightB(del.right);

return leftB(del);

}

return del;

}

}

是在函数外部定义的变量

2.局部变量:就是在函数内部定义的变量

1.全局函数和局部函数的作用域

局部变量作用域:只能在被声明的函数内部访问,函数外部使用不了。这也是不同函数里可以定义名称一样变量的原因

全局变量作用域:可以在整个程序范围内访问,任意函数都可以访问

#1.局部变量,外部访问不了

def f1 (v1,v2): #参数也属于局部变量

sum = v1+v2

a = 5 #局部变量,函数外部访问不了

return sum

--------------------------------

print(a) #报错,NameError: name 'a' is not defined

=====================================================================

#2.全部变量,函数里外都可以访问

a =3

def f3(v2):

# a = a+1 注意:报错,因为局部作用域内只能引用全局域变量的值,而不能修改全局作用域的值。

# b = a+1 则不会报错,引用全局变量的值,运算后给赋给局部变量b.

return a+1 #外部的全局变量函数内部使用

print(f3(1))

=============结果如下======================

4

===================================-===================================

#3.如果全局变量的名字和局部变量的名字相同,那么使用的是局部变量的

sum =5

def f2(v2):

sum =0

while v2 

sum += v2 #这里sum使用的是局部变量的初始值0,而不是全局sum=5

v2 += 1

return sum

print(sum)

print(f2(0))

===========结果如下=========================

5

45

===========================================

2.局部变量声明为全局变量global

val =10

def f1(v1):

val =5

return val

print(val ) #结果是10,因为局部变量val作用域只是函数内

print(f1(1)) #5

#使用global将局部变量声明为全局变量

val =10

def f1(v1):

global val

val = 30

return val

print(val ) #结果是10.虽然声明了global,但是函数要调用才会执行,才会更新val的值

val =10

def f1(v1):

global val

val = 30

return val

f1(2)

print(val ) #结果是30.调用函数f1后,将val的值给刷新了。

本文由职坐标整理并发布,希望对同学们有所帮助。了解更多详情请关注职坐标大数据云计算大数据安全频道!

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值